zoukankan      html  css  js  c++  java
  • 面试常用算法——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)。

  • 相关阅读:
    如何保持mysql和redis中数据的一致性?
    秒杀系统设计&测试
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    数据库关联子查询和非关联子查询
    mysql中 = 与in区别_浅析mysql中 exists 与 in 的区别,空判断
    mysql关键字执行顺序
    python中字典删除元素
    Python list根据下标插入/删除元素
    nginx504网关超时解决方法
    CDN加速
  • 原文地址:https://www.cnblogs.com/YESheng/p/3664794.html
Copyright © 2011-2022 走看看