解题思路:
解题思路:
特定函数解析:
对于这道题;我最开始用暴力枚举,并且循环层次搞的有点混乱,最后一头雾水,我用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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复