leetcode第五题:最长回文子串

5 篇文章 0 订阅

一开始的错误想法

后缀数组法:把S倒置过来得到S’,然后将他们拼接在一起得到字符串T,在T的最中间插入一个字符串中没有的符号+,遍历这个字符串T,发现加号之前有跟后面一毛一样的子字符串,输出。错误点:对于ABCDETFDCBA这样的字符串,遍历得出的最长回文子串将会是ABCD,但实际上最长子串长度仅为1.

动态规划法

对于所给的字符串s,假设dp[i][j]=true表示字符串s[i...j]是回文子串,那么dp[i+1...j-1]必定也为true。则求解最长回文子串就可以分解成一系列子问题,并通过动态规划来求解了。

public String longestPalindrome(String s) {
        if(s==""||s.length()==0)
        	return s;
         int[][] dp=new int[s.length()][s.length()];
         int i=0,j=0;
         int start=0;
         int end=0;
         int maxlen=0;

         for( i=s.length()-1;i>=0;i--)
		 {
		 	for(j=i;j<s.length();j++){
		 		//单个字符一定是回文串
		 		if(i==j){
		 			dp[i][j]=1;
				}
            //如果是两个相邻且相同的字符一定是回文串
				 if(i+1==j&&s.charAt(i)==s.charAt(j)){
					dp[i][j]=1;
					// System.out.println(s.charAt(i));
				}
				//最左边和最右边的字符是一样的并且两边的字符是一样的,那么这是一个回文串
				//右边界要大于0,即字符串长度不可能为负数,左边界不能超出字符串长度
				 if(i+1<s.length()&&j-1>0&&dp[i+1][j-1]==1&&s.charAt(i)==s.charAt(j)){
					dp[i][j]=1;
				}
				//如果判断出是回文串并且当前记录的长度小于最长回文串的长度
				if(dp[i][j]==1&&maxlen<j-i+1){
					start=i;
					end=j;
                    maxlen=j-i+1;
				}
			}
		 }
		//System.out.println(maxlen);
         return  s.substring(start,end+1);
	}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值