题意:给出一个字符串,通过在字符串前添加字符,使得新的字符串为最短的对称字符串

思路:假设原字符串为s,将其取反的字符串为text,求text的后缀与s的前缀相同时的索引,将text与s索引后的字符拼接起来就是要求的结果

具体代码如下:

public class Solution
{private int[] kmp_table(String s){int[] next = new int[s.length()];next[0] = -1;int j = 0;for (int i = 1; i < s.length(); i++) {int k = next[i - 1];while (k > -1 && s.charAt(k) != s.charAt(i - 1)) {k = next[k];}next[i] = k + 1;}return next;}private int kmp_search(String text, String pattern){int[] next = kmp_table(pattern);int m = 0, i = 0;while (m + i < text.length()) {while (pattern.charAt(i) == text.charAt(m + i)) {if (m + i == text.length() - 1) {return m;}i++;}m += i - next[i];i = next[i] > -1 ? next[i] : 0;}return 0;}public String shortestPalindrome(String s){if (s.isEmpty()) return s;String text = new StringBuilder(s).reverse().toString();int index = kmp_search(text, s);StringBuilder ans = new StringBuilder();ans.append(text);ans.append(s.substring(text.length() - index));return ans.toString();}
}

解法二:

public class Solution {private int[] kmp_table(String s){int[] next = new int[s.length()];next[0] = -1;int j = -1, i = 0;while (i < s.length()){while (j > -1 && s.charAt(i) != s.charAt(j)){j = next[j];}i++;j++;if (i < s.length() && j < s.length()){if (s.charAt(i) == s.charAt(j)) next[i] = next[j];else{next[i] = j;}}}return next;}private int kmp_search(String text, String pattern){int[] next = kmp_table(pattern);int m = 0, i = 0;while (m < text.length()) {while (i > -1 && pattern.charAt(i) != text.charAt(m)) {i = next[i];}m++;i++;if (i >= pattern.length()){break;}}return m - i;}public String shortestPalindrome(String s){if (s.isEmpty()) return s;String text = new StringBuilder(s).reverse().toString();int index = kmp_search(text, s);StringBuilder ans = new StringBuilder();ans.append(text);ans.append(s.substring(text.length() - index));return ans.toString();}
}

LeetCode Shortest Palindrome(kmp的妙用)相关推荐

  1. 【To Understand! 回文串6 KMP算法】LeetCode 214. Shortest Palindrome

    LeetCode 214. Shortest Palindrome Solution1:最笨的方法.时间复杂度O(n2)O(n2)O(n^2) 竟然能AC,xixixi class Solution ...

  2. leetcode 214 Shortest Palindrome

    lc214 Shortest Palindrome 可以将问题转化成找到原字符串的最长palindrome子串(注意,子串必须以s[0]为起始) 例如:sdserf sds为最长palindrome子 ...

  3. 【整数转字符串】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1: 不利用字符串 class Solution { public:bool isPalindrome(int x) {if ...

  4. 【To Understand!回文串8 哈希表】LeetCode 336. Palindrome Pairs

    LeetCode 336. Palindrome Pairs Solution1:我的答案 最笨的方法,果然因为时间复杂度太高而无法AC-- 难怪是hard 只是记录一下-- class Soluti ...

  5. 【回文串7】LeetCode 234. Palindrome Linked List

    LeetCode 234. Palindrome Linked List Solution1:我的答案 一遍过,哈哈哈! /*** Definition for singly-linked list. ...

  6. 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II

    LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...

  7. 【回文串4 DFS】LeetCode 131. Palindrome Partitioning

    LeetCode 131. Palindrome Partitioning DFS的经典套路题目!!! 八皇后问题写法类似!!! Solution1: 转载网址:http://www.cnblogs. ...

  8. 【回文串2】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1:我的答案 思路一:转化为字符串 class Solution { public:bool isPalindrome(in ...

  9. leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)

    题目 https://leetcode.com/problems/shortest-palindrome/ 题解 看了 Related Topics - Rolling Hash 下的相关题目,看到了 ...

最新文章

  1. ORB_SLAM2局部建图线程
  2. 异常检测算法:Isolation Forest
  3. r软件linux 安装失败,R语言在Linux环境下安装Curl出错问题的解决
  4. 解决NIOS II工程拷贝后无法编译问题
  5. 《Linux系统和网络性能监测》读书笔记
  6. 史上最会抄的数学家!把阿拉伯数字直接抄进自己的书里,连中国几千年前的名著都惨遭毒手.........
  7. linux日常常用命令分析
  8. 血眼龙王萧沙传-翠花篇
  9. toastr-min.css,Toastr插件提示框使用说明
  10. AcWing 796. 子矩阵的和
  11. 四则运算2之设计思路篇
  12. Vijos 1303
  13. 文件完整性的检测与监控
  14. logo下方显示技术支持信息_用“技术支持信息”显示的OEM信息备份修改方法
  15. 共轭、转置,共轭转置和逆矩阵的性质
  16. 软件版本中的beta,rc,ga是什么意思
  17. 二叉树基础题(五):二叉树的下一个节点最低公共祖先节点
  18. 远控软件GHOST源码免杀
  19. 【分享】“抖店“在集简云平台集成应用的常见问题与解决方案
  20. 浙里办开发票据认证单点登陆、令牌获取用户信息

热门文章

  1. linux系统中用户切换
  2. linux 相对路径
  3. Google PageRank的计算源代码
  4. python这个软件学会能做什么工作-不要再复制粘贴了 !学会Python,分分钟搞定一整天的工作...
  5. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...
  6. python 吧-做为IT人的你 趁年轻学点Python吧
  7. python源代码-python源码
  8. python好找工作吗2017-2017,再来聊一聊Python,未来发展怎样?
  9. 学python要下载什么-从应用的角度去学习Python--为孩子下载课本
  10. 如何在电脑上使用python-如何在Windows上使用Python进行开发