关于求解最长回文子串,有dp做法,也有同样n^2的但只用,还有KMP,后缀数组??
1 int main(void) { 2 while (scanf ("%s", str + 1) == 1) { 3 int len = strlen (str + 1); 4 memset (dp, false, sizeof (dp)); 5 for (int i=1; i<=len; ++i) dp[i][i] = true; 6 for (int i=1; i
但是n^2的复杂度是过不了3068这题,下面用O(n)的算法解决
1 waabwswfd2 pre: waabwswfd len: 93 now: $#w#a#a#b#w#s#w#f#d# len: 204 pi: 012123212121412121215 maxlen: 3
1 /* 2 题意:求最长回文串(不是) 3 Manasher:一个好理解,实现方便,O(n)时间复杂的很屌的算法。 4 简单说一下原理:首先将原字符串每个相邻之间插入一个不可能在字符串出现的字符,这样可以解决奇偶问题 5 然后p[i]表示以i为回文中心,最长的回文长度(单边),然而在原字符串中ans = max p[i] - 1 6 我认为算法精髓在于求p[i]时充分利用了回文的性质,跳过了一些无用的扫描。如果不明白上面有例子 7 详细解释: 8 */ 9 /************************************************10 * Author :Running_Time11 * Created Time :2015-8-7 19:27:4612 * File Name :Manacher.cpp13 ************************************************/14 15 #include16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include