[算法]求一个字符串中连续出现的次数最多的子串

例如字符串“abababc”,最多连续出现的为ab,连续出现三次。用到了后缀数组这个数据结构首先生成后缀数组例如上面的字符串为:
abababc
bababc
ababc
babc
abc
bc
c

#include <iostream>
#include <string>
#include <vector>
using namespace std;
pair<unsigned int, string> fun(const string& str)
{
    vector<string> substrs;
    unsigned int maxCount= 1, count = 1;
    string substr;
    unsigned int i, len = str.length();
    for (i = 0; i < len; ++i)
    {
        substrs.push_back(str.substr(i,len-i));
    }
    for (i = 0; i < len; ++i)
    {
        for(unsigned int j = i; j < len; ++j)
        {
            count = 1;
            for (unsigned int k = j +(j-i); k < len; ++k)
            {
                ++count;
                if(substrs.at(i).substr(0,j-i) == substrs.at(k).substr(0,j-i))
                {
                    ++count;
                }
                else
                {
                    break;
                }
            }
            if (count > maxCount)
            {
                maxCount = count;
                substr = substrs.at(i).substr(0,j-i);
            }
        }
    }
    return make_pair(maxCount,substr);
}
int main()
{
    string str;
    pair<unsigned int, string> rs;
    while (cin>>str)
    {
        rs = fun(str);
        cout<<rs.second<<":"<<rs.first<<endl;
    }
    return 0;
}

 参考《程序员面试宝典》第二版

 

你可能感兴趣的:(字符串)