概念
回文串(Palindrome)是一个正读和反读都一样的字符串。如“aba”,“abcba”等都是回文串。
验证回文串
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。地址:验证回文串
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
正常情况下,如果只有一个字母,验证回文串,就是定义头尾双指针,头指针++和尾指针–同时移动来判断对应下标字符是否相等。这题加入和数字和字母的组合判断是否回文,同时还有其他符号,思路是一样,多了一部就是头尾指针遇到非数字非字母的字符直接跳过。同时题目要求忽略大小写,这里只有数字和字母才有可能进入第二个else if,值得注意的是,toUpperCase方法在遇到大写字母或者数字,就是其本身,遇到小写字母将其转换为大写字母。
class Solution {
public boolean isPalindrome(String s) {
int start = 0;
int end = s.length() - 1;
while(start < end){
if(!Character.isLetterOrDigit(s.charAt(start))){
start++;
}else if(!Character.isLetterOrDigit(s.charAt(end))){
end--;
}else if(Character.toUpperCase(s.charAt(start++)) != Character.toUpperCase(s.charAt(end--))){
return false;
}
}
return true;
}
}
验证回文串II
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。地址:验证回文串II
示例 1:
输入: s = “aba”
输出: true
示例 2:
输入: s = “abca”
输出: true
解释: 可以删除 “c” 字符 或者 “b” 字符
这题的基本思路因为题目说只能删除一次,于是头尾指针在移动过程中,如果出现不同字符的情况,就有两种可能,要么删除头指针指向的字符,要么删除尾指针指向的字符,接着判断字符串是否回文,这里并没有真正删除,而是将指针移动一次。代码中validPalindrome方法使用了方法的重载。
class Solution {
public boolean validPalindrome(String s) {
int start = 0;
int end = s.length() - 1;
while(start < end){
if(s.charAt(start) != s.charAt(end)){
return validPalindrome(s, start + 1, end) || validPalindrome(s, start, end - 1);
}
start++;
end--;
}
return true;
}
private boolean validPalindrome(String s, int start, int end){
while(start < end){
if(s.charAt(start++) != s.charAt(end--)){
return false;
}
}
return true;
}
}