01_求给定字符串最长重复子串

来源:互联网 发布:网络骚扰电话怎么举报 编辑:程序博客网 时间:2024/06/08 09:09
#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;//给定一个字符串,求出其最长的重复子串//方法一string lsubstr_1(const string & str){ vector<string> vs;for (int i = 0; i < str.size(); i++)vs.push_back(str.substr(i));sort(vs.begin(), vs.end());int max = 0;int flag = 0;for (int i = 0; i <( vs.size()-1); i++){int j = 0;while (vs[i][j] == vs[i + 1][j] && j < vs[i].size() && j < vs[i+1].size())j++;if (j > max){max = j;flag = i;}           }return vs[flag].substr(0, max);} //方法二string lsubstr_2(const string & str){string maxstr;for (int i = 0; i < str.size();i++)for (int j = (str.size() - i); j >=1 ; j--){string subs = str.substr(i, j);int front = str.find(subs);int back = str.rfind(subs);if (front != back && subs.size() > maxstr.size())maxstr = subs; }return maxstr;} //方法三string lsubstr_3(const string & str){string maxstr;for (int i = 0; i < str.size(); i++)for (int j = 0; j < i; j++){string temp;int k = j;int m = i;while (str[m] == str[k] && i<str.size() && k<str.size()){m++; k++;}temp = str.substr(j, k - j);if (temp.size()>maxstr.size())maxstr = temp;}return maxstr;} void main(void){string test;getline(cin, test);cout << lsubstr_1(test) << endl;cout << lsubstr_2(test) << endl;cout << lsubstr_3(test) << endl;}

阅读全文
0 0