最长回文子串

解析:

  递归:

  回文子串,一开始想的是用递归求解,对这个字符串直接判断如果是,那么直接返回就可以,如果不是,那么我们就需要考虑两种情况了,一种是舍去开头,一种是舍去结尾,这样一直递归下去,直到某个时刻找到一个字符串是回文的,那么这个肯定是最长的子串。

  动态规划:

  考虑建立一个二维的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 }

 

posted @ 2019-09-27 11:29  小路不会迷路  阅读(197)  评论(0编辑  收藏  举报