求字符串中的最长回文子串
2013-10-03 15:34
323 查看
方法一(暴力法):
方法二(转自待字闺中):
找出字符串中所有的回文子串,设定P[i][j]:
为true时,表示str[i...j]为回文;
为false时,表示str[i...j]不是回文。
则,当
i == j 时,表示P[i][j] = true;
j = i+ 1时,P[i][j] = str[i] == str[j];
其他,p[i][j] = P[i+1][j-1] && (str[i] == str[j])
根据其状态转移的方程,P[i][j]所代表的的字符串,长度从1开始变化,逐渐到整个字符串,是这样一个构建过程,所以外层循环应该是要所判断的字符串的长度,基本代码如下:
字符串中所有的回文子串都已找到,遍历P找到最长的回文子串即可。
#include <stdio.h> #include <string.h> bool Palindrome(const char *str, int start, int end) { for(int i = start, j = end; i < j; i++, j--) { if(str[i] != str[j]) { return false; } } return true; } int main() { char *str = "adaiziguizhongrenergnohziugiziada"; int i, j, n, maxLength = 0, start, end; n = strlen(str); for (i = 0; i < n; ++i) { for (j = n-1; j >= i; --j) { if (Palindrome(str, i, j)) { if ((j - i) > maxLength) { maxLength = j - i; start = i; end = j; } } else continue; } } for (i = start; i <= end; i++) { printf("%c",str[i]); } printf("\n%d\n", maxLength); return 0; }
方法二(转自待字闺中):
找出字符串中所有的回文子串,设定P[i][j]:
为true时,表示str[i...j]为回文;
为false时,表示str[i...j]不是回文。
则,当
i == j 时,表示P[i][j] = true;
j = i+ 1时,P[i][j] = str[i] == str[j];
其他,p[i][j] = P[i+1][j-1] && (str[i] == str[j])
根据其状态转移的方程,P[i][j]所代表的的字符串,长度从1开始变化,逐渐到整个字符串,是这样一个构建过程,所以外层循环应该是要所判断的字符串的长度,基本代码如下:
#include <stdio.h> #include <string.h> void isPalin(char *str) { int n = strlen(str); bool P ; int i, j, L; //L表示字符串的长度 //长度为1的都是回文 for (i = 0; i < n; ++i) { P[i][i] = true; } //长度可能从2开始 for (L = 2; L <= n; L++) { for (i = 0; i < n-L+1; i++) { j = i+L-1; //设置结束的位置 if (L == 2) //长度为2的情况,递归出口 P[i][i] = (str[i] == str[j]); else P[i][j] = (str[i] == str[j]) && P[i+1][j-1]; } } return; }
字符串中所有的回文子串都已找到,遍历P找到最长的回文子串即可。
相关文章推荐
- 字符串之最长回文子串 manacher算法
- Manacher算法: O(n)时间求字符串的最长回文子串
- 在一个字符串中,找出最长回文子串
- JAVA:返回字符串中最长回文子串的长度
- Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串
- 最长回文子串(Manacher算法模板题)&&对称字符串问题
- ] 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- LeetCode之“字符串”:最长回文子串
- CSU1328 近似回文词(字符串处理,最长回文子串)
- 2014百度校园招聘笔试——求一个字符串的最长回文子串
- hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )
- Manacher算法求字符串的最长回文子串
- hihoCoder - 1032 - 最长回文子串 (字符串~)
- Manacher算法: O(n)时间求字符串的最长回文子串
- 求给定字符串的最长回文子串
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
- Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串
- 最长对称字符串问题/最长回文子串问题
- 字符串反转、包含、全排列、最长回文子串