zoukankan      html  css  js  c++  java
  • leetcode 214 Shortest Palindrome

    lc214 Shortest Palindrome

    可以将问题转化成找到原字符串的最长palindrome子串(注意,子串必须以s[0]为起始)

    例如:sdserf

    sds为最长palindrome子串

    只需要将sds之后的子串翻转一下,补充到原字符串之前即可

    fre + sdserf

    那么如何找到最长palindrome子串呢?

    使用KMP

    s + “@” + reverse(s)

    @的目的是保证s的每一位都与其翻转后相应位置对应,避免由于字符串长度为奇数或为偶数而产生的差别

    与原版KMP算法稍微有一些区别,原版kmp表的每一位kmp[i]表示s(0~i-1)不包含i,而这里的KMP表则应该包含i,为s(0~i)

    除此之外,由于我们这里只需要求kmp表而不需要考虑模式串和主串的匹配,所以不需要将kmp[0]设为-1,而是直接设为0

    具体KMP的算法原理可以参见:https://www.cnblogs.com/yjiyjige/p/3263858.html

     1 class Solution {
     2     public String shortestPalindrome(String s) {
     3         String temp = s + "!" + new StringBuilder(s).reverse().toString();
     4         
     5         int[] KMP = kmp(temp);
     6         return new StringBuilder(s.substring(KMP[KMP.length-1])).reverse() + s;
     7         
     8     }
     9     private int[] kmp(String s){
    10         int k=0;
    11         int[] res = new int[s.length()];
    12         
    13         for(int i=1; i<s.length()-1; ){
    14             if(s.charAt(k) == s.charAt(i)){
    15                 res[i] = ++k;
    16                 i++;
    17             }else{
    18                 if(k > 0){
    19                     k = res[k-1];
    20                 }else{
    21                     i++;
    22                 }
    23             }
    24         }
    25         return res;
    26     }
    27 }
  • 相关阅读:
    Apache Mahout
    ganglia安装
    编译出错 recompile with -fPIC
    centos6.4 基本安装nagios
    HDU1285 确定比赛名次
    HDU2888 Check Corners(二维RMQ)
    HDU3183 A Magic Lamp
    HDU1711 Number Sequence(KMP模版题)
    HDU3694 Fermat Point in Quadrangle(求四边形费马点)
    POJ2155 Matrix(二维树状数组)
  • 原文地址:https://www.cnblogs.com/hwd9654/p/11042492.html
Copyright © 2011-2022 走看看