解题思路:
解题思路:
特定函数解析:
对于这道题;我最开始用暴力枚举,并且循环层次搞的有点混乱,最后一头雾水,我用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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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