zoukankan      html  css  js  c++  java
  • LeetCode 5

    原题如下:

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

    如果选择任一子串,计算子串是否互文,然后取最大的子串,其时间复杂度为O(n*n*n)=O(n^3),这肯定是过不了测试的。

    另一种方法是选择某一字符,以此字符为中心,分别向左右两边扩展,计算以此字符为中心的最大互文字符串。当然需要注意,如果子串长度为偶数,则是以两个字符为中心。这个方法最坏的时间复杂度为O(2*n*n)=O(n^2)。最坏情况出现在字符串都是相同字符的情况,可以做一下优化处理,这样时间复杂度可以进一步下降。具体算法见如下代码:

     1     public String longestPalindrome(String s) {
     2         if (s.length() < 2) {
     3             return s;
     4         }
     5         int maxLen = 1;
     6         int maxi = 0;
     7         int maxj = 1;
     8         for (int i = 1; i < s.length()-maxLen/2-1; i++) {
     9             if (s.charAt(i) == s.charAt(i + 1) || s.charAt(i) == s.charAt(i - 1)) {
    10                 continue;
    11             }
    12             int j = 1;
    13             for (; i - j >= 0 && i + j < s.length() && s.charAt(i - j) == s.charAt(i + j); j++);
    14             int len = --j * 2 + 1;
    15             if (len > maxLen) {
    16                 maxLen = len;
    17                 maxi = i - j;
    18                 maxj = i + j + 1;
    19             }
    20         }
    21         for (int i = 0; i < s.length()-maxLen/2;) {
    22             int j = i;
    23             for (; j + 1 < s.length() && s.charAt(j) == s.charAt(j + 1); j++);
    24             if(i != j) {
    25                 int ii = i, jj = j;
    26                 while (ii >= 0 && jj < s.length() && s.charAt(ii) == s.charAt(jj)) {
    27                     ii--;
    28                     jj++;
    29                 }
    30                 ii++;
    31                 jj--;
    32                 int len = jj-ii+1;
    33                 if (len > maxLen) {
    34                     maxLen = len;
    35                     maxi = ii;
    36                     maxj = jj + 1;
    37                 }
    38             }
    39             i = j + 1;
    40         }
    41         return s.substring(maxi, maxj);
    42     }

    参考源码:https://github.com/pkufork/Martians/blob/master/src/main/java/com/pkufork/martians/leetcode/L5_LongestPalindromicSubstring.java

  • 相关阅读:
    Dockerfile
    最近遇到的jsfl开发问题总结
    【Distributed】大型网站高并发和高可用
    【Distributed】CDN
    【Distributed】限流技巧
    【Java并发】锁机制
    【Java并发】线程通信
    【Java并发】线程安全和内存模型
    【Java并发】基础
    【Redis】基本数据类型及命令操作(超详细)
  • 原文地址:https://www.cnblogs.com/pkufork/p/ds_leetcode_5.html
Copyright © 2011-2022 走看看