Leetcode:5. Longest Palindromic Substring

一开始题目没读懂,下面是求首末是同一个字符的最长子字符串

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/*
 * 求首末是同一个字符的最长子字符串
 * */
public class Sum22 {
    public String longestPalindrome(String s) {
        String string="";
        int max= 0;
        for (int i = 0; i < s.length(); i++) {
            char a = s.charAt(i);
            for (int j = s.length()-1; j >= 0; j--) {
                char b= s.charAt(j);
                if(a==b){
                    string = j-i+1>string.length()?s.substring(i,j+1):string;
                }
            }
        }
        return string;
    }
    public static void main(String[] args) {
        String string = "abcdf";
        System.out.println(string.substring(0,2));
    }

}

看到是求解最长回文串,也蒙逼了,不会写,这里参考的是:http://blog.csdn.net/linhuanmars/article/details/20888595

 

public class Sum22 {
    public String longestPalindrome(String s) {
        int len = 0;
        String result = "";
        for (int i = 0; i < 2*s.length()-1; i++) {
            int left = i/2;                       
            int right = i/2;
            if(i%2==1){
                right++;
            }
            String string = getSubString(s, right, left);
            if(len<string.length()){
                len = string.length();
                result = string;
            }
        }
        return result;
    }
    
    public  String  getSubString(String s,int right,int left){
        while(left>=0&&right<s.length()&&s.charAt(right)==s.charAt(left)){  //left,right同时移动,并且在两个字符相同的情况下移动
            left--;     
            right++;
        }            //while结束后,left比实际要的字符串最右侧位置小1,right要大1
        return s.substring(left+1,right);  //substring()是从start位置开始,end-1位置结束,注意不包括end
    }
    public static void main(String[] args) {
    
    }

}

第二种方法是动态规划,没看太懂   http://blog.csdn.net/linhuanmars/article/details/20888595  http://blog.csdn.net/hopeztm/article/details/7932245

这里动态规划的思路是 dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。

则根据回文的规则我们可以知道:

如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]

当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。

import sun.net.www.content.text.plain;


public class Sum22 {
    public String longestPalindrome(String s) {
        boolean[][] palin = new boolean[s.length()][s.length()];
        if(s.length()==0||s==null){
            return "";
        }
        String res = "";
        int len = 0;
        for (int i = s.length()-1; i >=0; i--) {
            for (int j = i; j < s.length(); j++) {
//                if(s.charAt(i)==s.charAt(j)&&(j-i<=2||palin[i+1][j-1]==true)){  / //这里j-i<=2的意思是i,j中间只有一个字符,palin[i+1][j-1]是靠里面的子字符串
                    palin[i][j] = true;
                    if(j-i+1>len){
                        res = s.substring(i,j+1);
                        len = j-i+1;
                    }    
                }
            }
        }
        return res;
    }
    
    
    public static void main(String[] args) {
        boolean[][] palin = new boolean[2][2];
        
        System.out.println(palin[0][0]);
    }

}

原文地址:https://www.cnblogs.com/Michael2397/p/8036163.html