解析:
递归:
回文子串,一开始想的是用递归求解,对这个字符串直接判断如果是,那么直接返回就可以,如果不是,那么我们就需要考虑两种情况了,一种是舍去开头,一种是舍去结尾,这样一直递归下去,直到某个时刻找到一个字符串是回文的,那么这个肯定是最长的子串。
动态规划:
考虑建立一个二维的dp数组,对于动态规划的思路而言,与递归是有些不一样的,一开始我总想着状态转移方程与第一个和最后一个元素有什么关系,后来才发现是将第一个与最后一个抵消掉。
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
1 class Solution { 2 public String longestPalindrome(String s) { 3 int n=s.length(); 4 if(n==0) 5 return s; 6 boolean[][] dp=new boolean[n][n]; 7 for(int i=0;i<n;i++) 8 for(int j=0;j<=i;j++) 9 dp[i][j]=true; 10 for(int i=1;i<n;i++) 11 for(int j=0;j<n-i;j++) 12 { 13 dp[j][j+i]=(s.charAt(j)==s.charAt(j+i))&&dp[j+1][j+i-1]; 14 } 15 String res=""; 16 for(int i=0;i<n;i++) 17 for(int j=i;j<n;j++) 18 { 19 if(dp[i][j]==false) 20 continue; 21 else 22 { 23 res=((j-i+1)>res.length())?s.substring(i,j+1):res; 24 } 25 } 26 return res; 27 } 28 }