您的位置:首页 > 职场人生

求一个字符串中连续出现次数最多的子串(程序面试宝典)

2013-07-23 19:04 253 查看
//求一个字符串中连续出现次数最多的子串

/*

Author: Mcdragon

Date: 15-07-11 21:17

Description: 求一个字符串中连续出现次数最多的子串.

基本算法描述:

给出一个字符串abababa

1.穷举出所有的后缀子串

substrs[0] = abababa;

substrs[1] = bababa;

substrs[2] = ababa;

substrs[3] = baba;

substrs[4] = aba;

substrs[5] = ba;

substrs[6] = a;

2.然后进行比较

substrs[0]比substrs[1]多了一个字母,如果说存在连续匹配的字符,那么

substrs[0]的第1个字母要跟substrs[1]首字母匹配,同理

substrs[0]的前2个字母要跟substrs[2]的前2个字母匹配(否则不能叫连续匹配)

substrs[0]的前n个字母要跟substrs
的前n个字母匹配.

如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.

*/

#include <iostream>

using namespace std;

#include <utility>//pair在此头文件

#include <vector>

#include <string>

#include <string.h>

pair<int, string> func(const string &str)

{

vector<string> substrs;

int maxcount = 1, count = 1;

string substr;

int len = str.length();

for(int i=0; i<len; i++)

substrs.push_back(str.substr(i,len-i));

for(i=0; i<len; i++)

cout<<substrs[i]<<endl;

for(i=0; i<len; i++)

{

count = 1;

for(int j=i+1; j<len; j++)

{

if(substrs[i].substr(0,j-i) == substrs[j].substr(0,j-i))

{

++count;

for(int k=j+(j-i); k<len; k+=(j-i))

{

if(substrs[i].substr(0,j-i) == substrs[k].substr(0,j-i))

++count;

else

break;

}

if(count > maxcount)

{

maxcount = count;

substr = substrs[i].substr(0,j-i);

}

}

}

}

return make_pair(maxcount, substr);

}

int main()

{

string str;

pair<int, string> rs;

while(cin>>str)

{

rs = func(str);

cout<<rs.first<<"\t"<<rs.second<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: