动态规划—最长回文子串LEETCODE第5题深度剖析

Posted godoforange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划—最长回文子串LEETCODE第5题深度剖析相关的知识,希望对你有一定的参考价值。

动态规划对于笔者来说有很重要的意义

一、题目如下:

技术图片

对于此类题目,笔者常用的的办法是先做个暴力解题思路,然后再对暴力法进行优化。

二、暴力法

//字串遍历
public static String longestPalindrome(String s) {
   String result="";
    if(s.length()==1) return s;
for(int i=0;i<s.length();i++) {
for(int j=i+1;j<s.length()+1;j++) {if(test(s.substring(i,j))&&s.substring(i,j).length()>result.length())result=s.substring(i,j);}}
return result;}
//回文判断
public static boolean test(String str) 
{for(int i=0;i<str.length()/2;i++) {if(str.charAt(i)!=str.charAt(str.length()-1-i)) 
return false;}
return true;
}

 

这段代码虽然不出意外的超时了,但是确实是我们第一步要考虑的。这个暴力法很简单,一个一个字串的检测,直到检测完所有的字符串。可是这不是我们想要的。

三、动态规划方法

首先要修改的就是我们的第一个字符串遍历的方法。思路为,既然我们知道了一个串为回文,那这个串左字母和右字母如果相同的话,不就又是一个回文字符串了吗。

不过这个思路要解决的问题有俩个:

1.找到所有起始字符串,并且将这些字符串下标保存到ArrayList数组里面

2.对每个字符串进行动态扩张。扩张到不能再扩为止。

public static String longestPalindrome(String s) {
        //定义一个结构保存所有字串
        class Str{
            Str(int i,int j){
                this.i=i;
                this.j=j;
            }
            int i;
            int j;
        }
        if(s.length()==1) return s;
        ArrayList<Str> al =new ArrayList<>();
        for(int i=0;i<s.length();i++) {
            Str str = new Str(i,i);
            al.add(str);
            if(i!=s.length()-1) {
                if(s.charAt(i)==s.charAt(i+1)) {
                    Str str2 = new Str(i,i+1);
                    al.add(str2);
                }
            }
        }
        Str large = new Str(0,0);
        for(Str str:al) {
            while(str.i!=0&&str.j!=s.length()-1) {
                if(s.charAt(str.i-1)==s.charAt(str.j+1)) {
                    str.i--;
                    str.j++;
                }else {
                    break;
                }
            }
            if((str.j-str.i)>=(large.j-large.i)) large=str;
        }
        return s.substring(large.i,large.j+1);
        
    }

 

技术图片

四、笔者对动态规划法的看法。

动态规划没有确切的定义,但拿这题来说,笔者只是把所有需要的数据存储在内存中。再把这些数据拿出来进行动态扩张。

以上是关于动态规划—最长回文子串LEETCODE第5题深度剖析的主要内容,如果未能解决你的问题,请参考以下文章

你必须掌握动态规划——LeetCode题目5:最长回文子串

LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String动态规划

LeetCode 第516题:最长回文子序列

leetcode-5 最长回文子串(动态规划)

Leetcode 5. 最长回文子串

leetcode刷题动态规划-第1篇