在字符串中查寻最长重复子串
在字符串中查找最长重复子串
如何在字符串中查找最长重复子串?比如字符串"abcdtttabcd"的最长重复子串为“abcd”,"cabcabca"的最长重复字串为“cabca”,"cabcabcacabcabca"的最长重复字符串为“cabcabca”。
分析:
重复子串的起始位置如何?如果子串1的开始位置为i,那么子串1的重复子串(设为子串2)的开始位置最小为i+1。变量i从0开始遍历字符串,对于每个变量i变量j从i+1开始遍历。比较字符是否相等,如果相等字符记数增加1。根据贪心算法的原则进行了一些优化。
std::string LCS_LENGTH_SIMPLE(std::string strX) { int m=strX.length(); int lcs=0; int npos=-1; for(int i=0;i<m;i++)//i从0开始 { int lcount=0; for(int j=i+1;j<m;j++)//对于每个i,j从i+1开始 { lcount=0; if(strX.at(i)==strX.at(j))//如果字符相等 { lcount++; int k=std::min(m-i-1,m-j-1);//位置i和j到字符串结尾的最小字符数 for(int t=1;t<=k;++t)//判从相等的字符往后再进行比较 { if(strX.at(i+t)==strX.at(j+t))//相等则字符个数加1 lcount++; else { break; } } //记录最大重复字符串的位置和字符个数 if(lcs<lcount) { lcs=lcount; npos=i; } j=j+lcount-1;//优化,开始从新的位置寻找 } } if(lcount>0) i=i+lcount-1;//优化,开始从新的位置寻找 } std::string str; if(lcs>0) str=strX.substr(npos,lcs); return str; }
。