Longest Palindromic Substring 用KMP解决
s求逆,依次KMP比较记录最大的匹配长度,O(n^2
// Palindromic.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
/*s:babcbabcbaccba
s0:abccabcbabcbab
s1:bccabcbabcbab
s2:ccabcbabcbab
……
maxLen
*/
void GetNext(string s, int slen, int* next)
{
int i = 0,j = -1;
next[i] = -1;
while(i < slen - 1)
{
if(j == -1 || s[i] == s[j])
{
++ i;
++ j;
if(s[i] != s[j])
next[i] = j;
else
next[i] = next[j];
}
else
j = next[j];
}
}
int Compare(string suffix, int sufflen, string s, int slen, int* next)
{
int i = 0, j = -1, maxlen = 0;
while(i < slen && j < sufflen)
{
if(j == -1 || s[i] == suffix[j])
{
++ i;
++ j;
}else
j = next[j];
if(j > maxlen)
maxlen = j;
}
return maxlen;
}
string longestPalindrome(const string s, int slen)
{
string s_reverse = s;
reverse(s_reverse.begin(), s_reverse.end());
string maxPattern = "";
int maxlen = 0, len;
for(int i=0; i < slen; ++ i)
{
string suffix = s_reverse.substr(i);
int* next = new int[suffix.size()];
if(suffix.size() < maxlen)
break;
GetNext(suffix,suffix.size(), next);
len = Compare(suffix,suffix.size(), s, s.size(), next);
if(len > maxlen)
{
maxlen = len;
maxPattern = suffix.substr(0, len);
}
delete[] next;
}
return maxPattern;
}
//===========================================================================
void Test(char* testName, const string s, string expected)
{
if(testName != NULL)
printf("%s begins: \n", testName);
cout<<"s: "<< s<<endl;
string result = longestPalindrome(s,s.size());
if(expected == result)
printf("passed.\n");
else if(expected != result)
printf("failed.\n");
cout<<"result: "<<result<<endl;
}
// 空格在句子中间
void Test1()
{
string s = "eraabaabcde";
Test("Test1", s,"aabaa");
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
return 0;
}
)