leetcode 5.最长回文子串解法

220 阅读1分钟
package com.example.leetcodedemo;
//最长回文字符串类
public class LongAroundStr {
    public static void main(String[] args) {
        center("babad");
    }
    private static String dynamicguihua(String s){
        if(s.length() <= 1){
            return s;
        }
        int length = s.length();
        String longstr = s.substring(0,1);
        int longleng = 1;
        boolean[][] dy = new boolean[length][length];
        dy[0][0] = true;
        for(int r = 1 ; r < s.length() ; r++ ){
            for(int l = 0 ; l < r ; l++){
                if(s.charAt(r) == s.charAt(l) && (r-l<=2 || dy[l+1][r-1])){
                    dy[l][r]=true;
                    int len = r-l+1;
                    if(len>longleng){
                        longstr = s.substring(l,r+1);
                        longleng = len;
                    }
                }
            }
        }
        return longstr;
    }
    //中心递推法
    private static String center(String s){
        if(s.length() <= 1){
            return s;
        }
        int length = 0;
        String longstr = s.substring(0,1);
        for(int i = 0 ; i < s.length() ; i++){
            String str1 = loadAroudStr(s,i,i);
            String str2 = loadAroudStr(s,i,i+1);
            if(str1.length() > length){
                longstr = str1;
                length = str1.length();
            }
            if(str2.length() > length){
                longstr = str2;
                length = str2.length();
            }
        }
        return longstr;
    }

    private static String loadAroudStr(String s , int i ,int j){
        while((i>=0 && j<s.length()) && s.charAt(i) == s.charAt(j)){
            i--;
            j++;
        }
        return s.substring(i+1,j);
    }
}