解题思路:
解题思路:
特定函数解析:
对于这道题;我最开始用暴力枚举,并且循环层次搞的有点混乱,最后一头雾水,我用java写了出来,因为Java里面有个一个取字串的函数string.substring(); 突然就想到C++的string类是否有同样功能的函数;查阅了一下,确实有一个这样的函数:substr()
string substr(start, lenght)
功能:返回一个从指定位置开始的指定长度的子字符串
参数start:必选项。为所需字串的开始位置。
参数lenght:可选项。在返回的子字符串中应包括的字符个数。
说明:如果lenght为0或者负数,将返回一个空字符串。如果没有指定lenght,则子字符串将延续到主字符串的最后。
(整个题就用这个函数解决,然后说说思路)
题意解析:
题中说,从给定的字符串中,选出长度大于等于L的子字符串,并且打印出出现次数最多的子串,如果出现次数相同,则打印最长的子串,如果出现次数相同且字串长度相等,则打印最早出现的字串。
思路:
很多人想着循环嵌套,但是我们要处理好层次关系:首先,最外次循环应该是(题:大于等于L)子串的长度,即L到len(串的长度),这样即每次处理同样长度的串,并统计该串的相关数据,然后再处理L+1,L+2,……一直到串自身;次层循环应该是要处理的串(提取的长度为L的字串),次次层循环是再整个串中找和次层循环中找出来的字串相等的串,并统计个数;大概思路就是这样。
有几点细节:
1.怎能找最长的子串:首先这个长子串的个数要是最多(或者和比它短的串的个数相等),通过比较长度即可;
2.怎样找出现最早的相同长度的子串:用一个计数器来记录某个长度子串出现的次数,通过判断每一次的次数是否大于上次一次的次数即可(注意,我说的是大于)
注意事项:
计数器置零的位置;和一个保存最长子串的中间变量;
我也准备用C语言写一下这个题,用到一个strncmp()这个函数,有兴趣的可以先了解一下这个函数。
参考代码:
#include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <functional> using namespace std; int main() { int L, len, maxn=0; string s, t; while(cin >> L >> s) { len = s.length(); for(int i = L; i <= len; ++i) { for(int j = 0; i+j <= len; ++j) { string s1 = s.substr(j, i); int cnt = 0; for(int k = j; k+i <= len; ++k) { string s2 = s.substr(k, i); if(s1 == s2) { cnt++; } } if(cnt >= maxn) { if(cnt > maxn) { t = s1; maxn = cnt; } else { if(s1.length() > t.length()) { t = s1; } } } } } cout << t << endl; } return 0; }
0.0分
3 人评分
#include<iostream> using namespace std; int main() { int L; string S; cin >> L; if (L < 1) return 0; cin >> S; int max_s = 0, counts = 0;//串长,最多次数,次数 string word;//串 for (int i = 1; i != L + 1; ++i)//截取几个字符 { for (int j = 0; j + i != S.size(); ++j)//字符从第几个开始截取 { string s(S, j, i);//把S从下标第j个开始拷贝i个字符串个s for (int k = j; k + i != S.size(); ++k)//和s进行比对 { string w(S, k, i);//s和w进行比对 if (s == w)//如果相等 counts++;//次数自加 } if ((s.size() > word.size() && counts > 1) || counts > max_s) word = s, max_s = counts; counts = 0; } } cout << word; retu
C二级辅导-同因查找 (C语言代码)浏览:556 |
简单的a+b (C语言代码)浏览:586 |
C语言训练-8除不尽的数 (C语言代码)暴力解法,答案只有一个,直接输出就好了浏览:1045 |
汽水瓶 (C语言代码)浏览:764 |
简单编码 (C++代码)浏览:731 |
奖学金 (C++代码)浏览:2057 |
九宫重排 (C++代码)浏览:1410 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:672 |
【亲和数】 (C语言代码)浏览:929 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:770 |
冲进前五百冲鸭 2020-03-12 13:02:14 |
在蓝桥杯网站上最后一个测试数据时 5 但是答案是六个字母, 关键是别人的还能对,是什么情况