• 面试常用算法——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)。

  • 相关阅读:
    019_Mac实用的图像备份工具
    016_把普通用户免秘钥加入root用户的几种方式
    027_磁盘维护命令du等
    026_lsof命令经验总结
    004_wireshark专题
    029_mount bind挂载
    023_nginx跨域问题
    mysql-5.7 group commit 详解
    二段式提交协议
    mysql-5.7 密码过期详解
  • 原文地址:https://www.cnblogs.com/YESheng/p/3664794.html
Copyright © 2020-2023  润新知