用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
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的子串,依次类推...
代码如下:
这里只通过基本的循环完成需求,可能有其他算法,可以更快的计算出结果。
求回文串的基本思路是:从首字符开始取长度为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; }
这里只通过基本的循环完成需求,可能有其他算法,可以更快的计算出结果。
相关文章推荐
- 字符串中连续出现最多的子串 & 字符串中最长重复子串
- 求一个字符串中的最大连续重复子串
- 求一个字符串的最长无重复字母的连续子串
- 【字符串问题】求一个字符串中重复出现的最长的子串
- 给一个字符串,例如”ababc",要求返回"ab"。因为"ab”连续重复出现且最长。用C/C++语言写一个函数完成该算法,给出复杂度
- 找出一个字符串中出现的重复的最长的字符子串
- 求一个字符串的最长不重复子串的最大长度
- 重复子串问题(二):求一个字符串中连续出现次数最多的子字符串
- 求一个字符串中最长的非重复连续子串
- 重复子串问题(三):输出一个字符串中出现频率最高的子串
- 返回一个字符串中重复出现的最长字串的长度及其开始字符
- 字符串中连续出现最多的子串 & 字符串中最长反复子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 字符串中不重复连续字符子串的长度最大值
- 求一个串中出现的第一个最长重复子串