zoukankan      html  css  js  c++  java
  • Leetcode 214.最短回文串

    最短回文串

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

    示例 1:

    输入: "aacecaaa"

    输出: "aaacecaaa"

    示例 2:

    输入: "abcd"

    输出: "dcbabcd"

    这个题目是在字符串前面加字符构成一个最短的回文字符串。我们分析题意,就是找到从第一个字母起始的最长的回文字符串,然后把剩下的倒置加到前面,就得到了最短的回文字符串。怎么找到以第一个字母为起始的最长的回文串,我们可以把s转置,然后找到匹配转置后的字符串从原始字符串第一个开始位置能够匹配的最大长度。这时候我们可以考虑到使用KMP算法,因为KMP算法就是从目标字符串的第一个字母开始匹配。我们可以这么做

    S+"#"+S.reverse 然后使用KMP算法

     1 class Solution{
     2     public String shortestPalindrome(String s){
     3         String tmp=s+"#"+new StringBuilder(s).reverse().toString();
     4         int[] table=getTable(tmp);
     5         return new StringBuilder(s.substring(table[table.length-1])).reverse().toString()+s;
     6     }
     7     //KMP求next数组
     8     public int[] getTable(String s){
     9         int len=s.length();
    10         int[] table=new int[len];
    11         char[] a=s.toCharArray();
    12         for(int i=1,k=0;i<len;i++){
    13             while(k>0&&a[i]!=a[k]){
    14                 k=table[k-1];
    15             }
    16             if(a[i]==a[k]) k++;
    17             table[i]=k;
    18         }
    19         return table;
    20     }
    21 }
  • 相关阅读:
    distribution cleanup job & Agent History Clean Up
    在域环境下建立镜像
    查看发布服务器信息
    Publisherfailoverparnter
    查看/修改分发复制代理的各个属性
    一个分发复制+mirror的bug
    SQLIO.exe
    安装SQL2008 提示 创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se
    XOOM MZ606 刷机
    NYOJ242计算球体积
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10203041.html
Copyright © 2011-2022 走看看