面试常用算法——Longest Palindromic Substring(最长回文子串)

第一种:

public static void main(String[] args) {
        String s = "abcbaaaaabcdcba";
        int n,m;
        String re = "";
        for(int i = 0; i < s.length();i++){
            for(int j = i+1;j< s.length();j++){
                n = i;
                m = j;
                for(;j > i;j--,i++){
                    if(s.charAt(i) != s.charAt(j))
                        break;
                }
                if(j <= i){
                    if(m-n > re.length())
                        re = s.substring(n, m+1);
                }
            }
        }
        System.out.println(re);
    }

看的是国外的一篇博客,他把这种方法叫做是Naive Approach,这是最容易想到的一个方法,效率确实不怎样,时间复杂度是O(n^3)级。

第二种方法:

public static void main(String[] args) {

        String s = "abcbaaaaabcdcba";

        int[][] table = new int[s.length()][s.length()];
        int i, j;
        for (i = 0; i < s.length(); i++)
            for (j = 0; j < s.length(); j++)
                table[i][j] = 0;
        for (i = 0; i < s.length(); i++) {
            for (j = 0; j < s.length(); j++) {
                if (j + i >= s.length()) {
                    break;
                }
                if (j == j + i)
                    table[j][j + i] = 1;
                else if (j + 1 == j + i) {
                    if (s.charAt(j) == s.charAt(j + i))
                        table[j][j + i] = 1;
                } else {
                    if (s.charAt(j) == s.charAt(j + i)
                            && table[j + 1][j + i - 1] == 1)
                        table[j][j + i] = 1;
                }
            }
        }
        for (i = 0; i < s.length(); i++) {
            for (j = 0; j < s.length(); j++) {
                System.out.print(table[i][j] + " ");
                table[i][j] = 0;
            }
            System.out.println();
        }
    }

这个算法的思路:

构建一个n*n的表格,表格中table[i][j] == 1代表子串(i,j)是回文串,table[i][j] ==0即代表子串(i,j)不为回文串,并且有这样的推算规则:

1)table[i][i]必为1;

2)table[i][i+1]==1的满足条件是:s.charAt(i) == s.charAt(i+1);

3)其他table[i][j] == 1 的满足条件是:s.charAt(i) == s.charAt(j) && table[i+1][j-1] == 1.

该算法的时间复杂度为 O(n^2), 空间复杂度 O(n^2)。

原文地址:https://www.cnblogs.com/YESheng/p/3664794.html