2020年8月29日 最短回文串 shortestPalindrome
class Solution {
public String shortestPalindrome(String s) {
}
}
解题思路:
我的想法是这样子的,如果一个在一个字符串前面加上几个字符就能组成一个回文串,那么加上的这几个必定是该字符串末尾的几个字符的倒置。那么我们可以把一个字符串拆分成下面这样三个部分。
假设我们有一个字符串,abaca,那么要在前面添加字符让他成为一个回文,这个字符可以拆分为中间的回文部分以及后缀的多余
然后我们将后缀部分反制作为前缀就可以构成一个回文串。
那么经过这么一分析,问题就转变为求一个字符串中以开头作为起点的最长回文子串。
那么我们就从末尾开始遍历,删除节点后是否是一个回文串。当得到第一个回文串的时候结束。并且记录最长回文子串的长度。
思路清晰,但是有点慢。
char[] chars;
public String shortestPalindrome(String s) {
//第一步,找到包含头部的最长子回文串
//使用数组操作更快
chars = s.toCharArray();
int len=s.length();
for (int i=0;i<len;i++){
//如果是回文串
if (isPalindrome(len-i-1)) {
//新的字符串长度
char[] res=new char[len+i];
System.arraycopy(chars,0 ,res ,i,len );
for (int j=0;j<=i;j++){
res[j]=chars[len-j-1];
}
return new String(res);
}
}
return "";
}
public boolean isPalindrome(int index){
for (int i=0;i<index;i++,index--){
if (chars[i]!=chars[index]) {
return false;
}
}
return true;
}