zoukankan      html  css  js  c++  java
  • leetcode-5 最长回文子串(动态规划)

    题目要求:

    * 给定字符串,求解最长回文子串
    * 字符串最长为1000
    * 存在独一无二的最长回文字符串

    求解思路:

    * 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,
    * 那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。
    * 这样需要额外的空间O(N^2),算法复杂度也是O(N^2)。
    * 首先定义状态方程和转移方程:
    * P[i,j]=0表示子串[i,j]不是回文串。P[i,j]=1表示子串[i,j]是回文串。
    * P[i,i]=1
    * P[i,j]{=P[i+1,j-1],if(s[i]==s[j])
    * =0 ,if(s[i]!=s[j])}

    代码:

     1     public static String longestPalindrome(String s){
     2         if(s == null || s.length() == 1){
     3             return s;
     4         }
     5         int len = s.length();
     6         //flag[i][j]=true 表示子串i-j为回文字符串
     7         boolean[][] flags = new boolean[1000][1000];
     8         int start = 0;
     9         int maxlen = 0;
    10         for(int i=0; i<len; i++){
    11             flags[i][i] = true;
    12             //相邻的两个字符相同
    13             if( i<len-1 && s.charAt(i) == s.charAt(i+1)){
    14                 flags[i][i+1] = true;
    15                 start = i;
    16                 maxlen = 2;
    17             }
    18         }
    19         
    20         //m代表回文子串长度,从3开始
    21         for(int m = 3; m <= len; m++){
    22             for(int i = 0; i <= len-m; i++ ){
    23                 //依次比较是否符合状态转移方程
    24                 int j = i+m-1;
    25                 if(flags[i+1][j-1] && s.charAt(i)==s.charAt(j)){
    26                     flags[i][j] = true;
    27                     start = i;
    28                     maxlen = m;
    29                 }
    30             }
    31         }
    32         
    33         //如果存在回文子字符串
    34         if(maxlen >=2 ){
    35             return s.substring(start, start+maxlen);
    36         }
    37         //不存在则返回null
    38         return null;
    39     }
  • 相关阅读:
    静态变量一定要先声明后赋值
    建议3 三元操作的类型必一致
    IDEA 创建 Maven web项目注意事项
    js不同类型作比较
    exception中return方法
    exception 打印出异常栈踪迹
    spring controller使用了@ResponseBody却返回xml
    springboot中的406(Not Acceptable)错误
    把本地建好的项目提交到git上
    java基础---------方法和方法重载
  • 原文地址:https://www.cnblogs.com/bywallance/p/5546662.html
Copyright © 2011-2022 走看看