判断是否回文:
思路是双指针和滑动窗口。
class Solution {
public boolean isPalindrome(String s) {
int len = s.length();
int left = 0;
int right = len-1;
while(left < right){
char lc = s.charAt(left);
char rc = s.charAt(right);
if (!Character.isLetterOrDigit(lc)){
left++;
continue;
}
if (!Character.isLetterOrDigit(rc)){
right--;
continue;
}
if (Character.toLowerCase(lc) != Character.toLowerCase(rc)){
return false;
}
left++;
right--;
}
return true;
}
}
解决该问题的核心是从中心向两端扩散的双指针技巧
如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符,如果输入相同的 l
和 r
,就相当于寻找长度为奇数的回文串,如果输入相邻的 l
和 r
,则相当于寻找长度为偶数的回文串。
class Solution {
public String longestPalindrome(String s) {
String res = "";
for(int i=0; i < s.length(); i++){
String odd = palindrome(s,i,i);
String even = palindrome(s,i,i+1);
res = odd.length() > res.length() ? odd : res;
res = even.length() > res.length() ? even : res;
}
return res;
}
/**
* 以 left和 right 为中心向两边扩展,找到最长的回文子串
*/
public String palindrome(String s,int left,int right){
while(left >=0 && right< s.length() ){
if (s.charAt(left) == s.charAt(right)){
// 双指针,向两边展开
left--;
right++;
}else{
break;
}
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
//注意这里的substring函数:
//beginIndex – the beginning index, inclusive.
//endIndex – the ending index, exclusive.
// 参数下标从0开始,包括第一个参数,不包括第二个参数,左闭右开,所以如果两个参数写的一样,那么返回空串
return s.substring(left+1,right);
}
}