您的位置:首页 > 其它

用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)

2013-05-06 01:16 323 查看
字符串的最大回文串是指在字符串中连续重复出现的最长子串,如"jkjkfgsfgsfgsf",回文串有"jk":2,"fgs":3,"gsf":3,"sfg":2。(格式为 子串:出现次数)。

求回文串的基本思路是:从首字符开始取长度为2的子串"jk",然后取该子串后相邻的长度为2的子串"jk",两个子串相邻且相等,所以"jk"为该字符串的一个回文串,继续取之后的一个长度为2的子串"fg",与之前的子串不相等,则不再往下遍历,重新从首字符开始取长度为3的子串,依次类推,可以取长度为4,5,6,7的子串,不能取长度为8的子串,因为剩余的子串长度为6,不可能和长度为8的子串相等。这样一次循环结束后,从第二个字符开始取长度为2的子串,依次类推...

代码如下:

#include <string>
#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

typedef pair<string, int> PairStrInt;
class MyComp
{
public:
bool operator()(const PairStrInt& lh, const PairStrInt& rh)const
{
//按string长度比较,长度一样,按int大小比较
if(lh.first.length() == rh.first.length())
if(lh.second == rh.second)
return lh.first > rh.first;
else
return lh.second > rh.second;
else
return lh.first.length() > rh.first.length();
}
};

bool GetMaxRepeateSubstr(const string& str, string& strResult)
{
if(str.length() < 4) return false;

map<string, int> mapResult;

int nBegin = 0;
int nEnd = str.length() - 4;
for(; nBegin <= nEnd; ++nBegin)
{
int nSubLen = 2;
int nMaxLen = (str.length() - nBegin) / 2;
for(; nSubLen <= nMaxLen; ++nSubLen)
{
string strSub = str.substr(nBegin, nSubLen);
int nNextBegin = nBegin;
int nCount = 1;
while(nNextBegin + nSubLen + nSubLen < str.length())
{
string strS = str.substr(nNextBegin + nSubLen, nSubLen);
if(strSub == strS)
{
nNextBegin += nSubLen;
++nCount;
}
else
break;
}

if(nCount > 1)
{
map<string, int>::iterator iter = mapResult.find(strSub);
if(iter != mapResult.end())
iter->second = nCount;
else
mapResult.insert(make_pair<string, int>(strSub, nCount));
}
}
}

bool bGet = false;//mapResult中保存着所有的回文串,可以根据需求从map中取自己所需要的回文串
if(!mapResult.empty())
{
vector<PairStrInt> v(mapResult.begin(), mapResult.end());
strResult = v[0].second;
bGet = true;
}

return bGet;
}

int main()
{
string str("jkjkfgsfgsfgsf");
string strResult;
bool bGet = GetMaxRepeateSubstr(str, strResult);
if(bGet)
cout<<strResult<<endl;
else
cout<<"do not get result"<<endl;

return 0;
}


这里只通过基本的循环完成需求,可能有其他算法,可以更快的计算出结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐