zoukankan      html  css  js  c++  java
  • Leetcode 5. Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example:

    Input: "babad"
    
    Output: "bab"
    
    Note: "aba" is also a valid answer.

    Example:

    Input: "cbbd"
    
    Output: "bb"

    Similar Questions: Shortest Palindrome Palindrome Permutation Palindrome Pairs Longest Palindromic Subsequence Palindromic Substrings 

    Next challenges: Palindrome Permutation Palindrome Pairs Longest Palindromic Subsequence

    方法一:O(n)的时间复杂度。

    思路:对原字符串运行"马拉车"算法(Manacher's Algorithm),找到最长回文子串的中心位置所在,然后向两边扩充还原。

    关于Manacher's Algorithm的学习资料:

    https://segmentfault.com/a/1190000003914228

    http://www.cnblogs.com/grandyang/p/4475985.html

    代码:

     1 public class Solution {
     2     public String longestPalindrome(String s) {
     3         int maxRight = 0, pos = 0, maxLen = 0, maxPos = 0;
     4         String rs = "#";
     5         for(int i = 0; i < s.length(); i++) rs = rs + s.charAt(i) + "#";
     6         int[] RL = new int[rs.length()];
     7         for(int i = 0; i < rs.length(); i++) {
     8             if(maxRight > i) RL[i] = Math.min(maxRight - i, RL[2 * pos - i]);
     9             while(i - RL[i] - 1>= 0 && i + RL[i] + 1< rs.length() && rs.charAt(i - RL[i] - 1) == rs.charAt(i + RL[i] + 1)) RL[i]++;
    10             if(RL[i] + i > maxRight) {
    11                 pos = i;
    12                 maxRight = RL[i] + i;
    13             }
    14             if(maxLen < 2 * RL[i] + 1) {
    15                 maxLen = 2 * RL[i] + 1;
    16                 maxPos = i;
    17             }
    18         }
    19         return rs.substring(maxPos - RL[maxPos], maxPos + RL[maxPos] + 1).replace("#","");
    20     }
    21 }

    方法二:O(n2)的时间复杂度。

    思路:dp[i][j]表示s[i,...,j]是否为回文子串。以下2种情况,dp[i][j]为true:

    1.j<i+3并且s[i]==s[j]。(这个画图就会明白)

    2.j>=i+3并且dp[i+1][j-1]=true。

    实现的时候要先保证s[i+1,..,j-1]已经被遍历过。

    代码:

     1 public class Solution {
     2     public String longestPalindrome(String s) {
     3         boolean[][] dp = new boolean[s.length()][s.length()];
     4         int maxLen = 0;
     5         String rs = "";
     6         for(int j = 0; j < s.length(); j++) {
     7             int minI = j;
     8             dp[j][j] = true;
     9             for(int i = j - 1; i >= 0; i--) {
    10                 if(s.charAt(i) == s.charAt(j) && (j < i + 3 || dp[i + 1][j - 1])) {
    11                     dp[i][j] = true;
    12                     minI = i;
    13                 }else {
    14                     dp[i][j] = false;
    15                 }
    16             }
    17             if(j - minI + 1 > maxLen) {
    18                 maxLen = j - minI + 1;
    19                 rs = s.substring(minI, j + 1);
    20             }
    21         }
    22         return rs;
    23     }
    24 }
  • 相关阅读:
    WebAssembly学习(四):AssemblyScript
    Ramda
    React—生命周期
    网络拓扑图
    手机端的meta信息
    面试题
    Bootstrap路径导航
    Bootstrap 分页翻页
    Bootstrap栅格系统
    Bootstrap 屏幕类型
  • 原文地址:https://www.cnblogs.com/Deribs4/p/7233601.html
Copyright © 2011-2022 走看看