Palindrome 问题
5/22 String, Palindrome 问题
Palindrome 的定义是,给定 S, S=S'
KMP 算法的核心是 failure function ,在 currect position 不匹配的情况下,在之前的substring中寻找最长的 suffix 后缀,使得它和 substring 中的 prefix 前缀相同。
Palindrome 长度可能是奇数,也可能是偶数。所以指定 seed 往两边扩展的时候要注意先把 start / end 指针推到“不是 seed” 的位置上。
public class Solution {
public String longestPalindrome(String s) {
if(s.length() <= 1) return s;
if(s.length() == 2){
if(s.charAt(0) == s.charAt(1)) return s;
else return s.substring(1);
}
int maxStart = 0;
int maxEnd = 0;
int maxLength = 1;
for(int i = 0; i < s.length(); i++){
int start = i - 1;
while(start >= 0 && s.charAt(start) == s.charAt(i)) start --;
int end = i + 1;
while(end < s.length() && s.charAt(end) == s.charAt(i)) end ++;
while(start >= 0 && end < s.length()){
if(s.charAt(start) == s.charAt(end)){
start --;
end ++;
} else {
break;
}
}
if(end - start - 1 > maxLength){
maxLength = end - start - 1;
maxStart = start + 1;
maxEnd = end - 1;
}
}
return s.substring(maxStart, maxEnd + 1);
}
}ASC II 表里,一个字母的小写值与大写值的差正好是32 (小写字母值更大)
Character.isLetterOrDigit(char chr)
str.toLowerCase();
[重点] Shortest Palindrome
不过本质上讲,这种做法和我刚才写的第一种没有任何区别,只不过是一个从里向外,一个从外向里。。。于是这个写法在 large test case 上依然 TLE,还没有利用好 substring 结构的精髓。
于是在论坛 这个帖子 里出现了字符串大杀器,KMP. 关于这个问题,Yu's Garden 的帖子讲的非常赞,推荐一读。
KMP 算法的核心是 next function ,在 currect position 不匹配的情况下,在之前的substring中寻找最长的 suffix 后缀,使得它和 substring 中的 prefix 前缀相同。
Pattern 顺序不能错,是 SS' 而不是 S'S
Last updated