leetcode 214 Shortest Palindrome
时间:2019-06-17
本文章向大家介绍leetcode 214 Shortest Palindrome,主要包括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 }
原文地址:https://www.cnblogs.com/hwd9654/p/11042492.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法