最长回文子串

解析:

  递归:

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

  动态规划:

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

 

转载于:https://www.cnblogs.com/cold-windy/p/11596828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值