例如输入qweabcuwabcfw,输出结果为:重复字符串的长度3和位置4
第一种解法:以字符串的长度为外循环,内循环从字符串的第一个元素开始向后移动。
#include<iostream> #include<string> using namespace std; int main() { string str, tep; cout << "输入字符串" << endl; cin >> str; cout <<str.size()<<endl; int mysize = str.size(); int k =0; int max =0; int first; for (int i = 1; i <mysize; i++) { for (int j = 0; j < mysize-i; j++) { if (str[j]==str[j+i]) { k++; } else { k=0; } if(k>max) { max = k; first =j -k +1; } } } cout << max <<endl; return 0; }
第二种解法
题目:输入一行字符串。找出当中出现的同样且长度最长的字符串,输出它及其首字符的位置。
比如:“yyabcdabjcabceg",输出结果应该为abc 和3.
这里把子串从大到小排列,第一个满足条件的结果就是所求的最长子串
#include<iostream> #include<string> using namespace std; int main() { string str, tep; cout << "输入字符串" << endl; cin >> str; for (int i = str.length() - 1; i > 1; i--) { for (int j = 0; j < str.length(); j++) { if (j + i <= str.length()) { size_t t = 0; size_t num = 0; tep = str.substr(j, i);//从大到小取子串,从j位置开始取长度为i的子串 t = str.find(tep);//正序查找 num = str.rfind(tep);//逆序查找 if (t != num)//假设两次查找位置不一致,说明存在反复子串 { cout << tep << " " << t + 1 << endl;//输出子串及位置 system("pause"); return 0; } } } } }