of S is 1000, and there exists one unique longest palindromic substring.
思路。
1)动态规划。
这里动态规划的思路是 dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。
则根据回文的规则我们可以知道:
如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]
当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。
动态规划的进行是按照字符串的长度从1 到 n推进的。
2)中心扩展法因为回文字符串是以中心轴对称的,所以如果我们从下标 i 出发,用2个指针向 i 的两边扩展判断是否相等,那么只需要对0到
n-1的下标都做此操作,就可以求出最长的回文子串。但需要注意的是,回文字符串有奇偶对称之分,即"abcba"与"abba"2种类型,
因此需要在代码编写时都做判断。
#include <iostream> using namespace std; string getExpandAroundCenter(string s,int pre,int post) { string res; int len; while(pre >= 0 && post <= s.size()-1 && s[pre] == s[post]) { pre --; post ++; }len = post - pre + 1; res = s.substr(pre,len); return res; } string longestPalindromicSub(string s) { if(s.size() == 0 || s.size() == 1)return s; int longest=0; string str1,str2,res; for(int i=0;i<s.size()-1;i++) { //abcba str1 = getExpandAroundCenter(s,i,i); //abba str2 = getExpandAroundCenter(s,i,i+1); if(str1.size()>str2.size()) { if(str1.size() > longest) { longest = str1.size(); res = str1; } } else { if(str2.size() > longest) { longest = str2.size(); res = str2; } } } return res; } void main() { string s ="qabcbafffd"; string res = longestPalindromicSub(s); printf("The longest palindromic substring is %s.\n",res.c_str()); }