九度OJ 1528 最长回文子串 -- Manacher算法
2014-02-19 15:10
405 查看
题目地址:http://ac.jobdu.com/problem.php?pid=1528
题目描述:
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。
输入:
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。
输出:
对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。
样例输入:
样例输出:
来源: 腾讯2013年实习生招聘二面面试题
自己比较野蛮的方法
O(n)的回文子串Manacher算法(详细算法讲解见参考资料)
算法代码实现如下:
参考资料:http://tiankonguse.com/blog/?p=84
http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html http://www.akalin.cx/longest-palindrome-linear-time http://leetcode.com/2011/11/longest-palindromic-substring-part-i.html http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
相思题目:https://oj.leetcode.com/problems/longest-palindromic-substring/
题目描述:
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。
输入:
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。
输出:
对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。
样例输入:
abab bbbb abba
样例输出:
3 4 4
来源: 腾讯2013年实习生招聘二面面试题
自己比较野蛮的方法
#include <stdio.h> #include <string.h> int LenOfMaxPalindrome(char str[], int len, int low, int high){ int sum = 0; while (low >= 0 && high < len){ if (str[low] == str[high]){ sum += 2; --low; ++high; } else break; } return sum; } int MaxPalindrome (char str[]){ int len = strlen (str); int mid; int len1; int len2; int max; if ((len >= 2) && (str[0] == str[1])) max = 2; else max = 1; for (mid=1; mid<len-1; ++mid){ len1 = len2 = 0; len1 = LenOfMaxPalindrome(str, len, mid - 1, mid + 1) + 1; if (str[mid] == str[mid + 1]){ len2 = LenOfMaxPalindrome(str, len, mid - 1, mid + 2) + 2; } if (len1 < len2) len1 = len2; if (max < len1) max = len1; } return max; } int main(void){ char str[200001]; while (scanf ("%s", str) != EOF){ printf ("%d\n", MaxPalindrome (str)); } return 0; }
O(n)的回文子串Manacher算法(详细算法讲解见参考资料)
算法代码实现如下:
#include <stdio.h> void Manacher (char str[], int len, int Radix[]){ int mx = 0; //记录被影响到的最远的位置 int id = 0; //最长影响串的位置 Radix[0] = 0; int i; for (i=1; i<len; ++i){ Radix[i] = 1; if (mx > i){ Radix[i] = Radix[2 * id - i]; if (mx - i < Radix[i]) Radix[i] = mx - i; } while (str[i - Radix[i]] == str[i + Radix[i]]) ++Radix[i]; if (i + Radix[i] > mx){ mx = i + Radix[i]; id = i; } } } int Preproccess (char str[], char old_str[]){ int index; int len; char middle = '#'; str[0] = '$'; str[1] = middle; index = 0; len = 2; while (old_str[index]){ str[len++] = old_str[index++]; str[len++] = middle; } str[len] = '?'; return len; } int main(void){ char old_str[200001]; char str[400004]; int Radix[400004]; int len; int i; int ans; while (scanf ("%s", old_str) != EOF){ len = Preproccess (str, old_str); Manacher (str, len, Radix); ans = 0; for (i=1; i<len; ++i){ if (ans < Radix[i]) ans = Radix[i]; } printf ("%d\n", ans - 1); } return 0; }
参考资料:http://tiankonguse.com/blog/?p=84
http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html http://www.akalin.cx/longest-palindrome-linear-time http://leetcode.com/2011/11/longest-palindromic-substring-part-i.html http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
相思题目:https://oj.leetcode.com/problems/longest-palindromic-substring/
相关文章推荐
- 九度OJ 1528 最长回文子串 -- Manacher算法
- 九度笔记之 1528:最长回文子串 用manacher算法
- 九度题目1528:最长回文子串
- 1040. Longest Symmetric String-PAT 1528:最长回文子串-九度
- 【LeetCode】Longest Palindromic Substring && 【九度】题目1528:最长回文子串(腾讯2013年实习生招聘二面面试题)
- 九度 题目1528:最长回文子串
- 九度题目1528:最长回文子串 腾讯二面面试算法题
- 51Nod 1089 最长回文子串 V2(Manacher算法)
- POJ 3974 Palindrome 最长回文子串(manacher算法)
- 【算法知识总结】最长回文子串-Manacher算法
- 最长回文子串 V2(Manacher算法)
- [hdu 3068] Manacher算法O(n)最长回文子串
- HDU3068(最长回文子串manacher算法)
- 51nod1089---最长回文子串 V2(51nod基础:Manacher算法)
- [51Nod](1089)最长回文子串 V2 ---- Manacher算法
- Manacher算法: O(n)时间求字符串的最长回文子串
- 用manacher算法求最长回文子串
- [Jobdu] 题目1528:最长回文子串
- 最长回文子串 - Manacher算法
- 最长回文子串(Manacher算法)