125.题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
解析:
1.用正则表达式去掉非数字和字母(JavaScript需要)
2.如果字符串长度小于2,返回true
3.定义两个指针left和right,一个在字符串开头,一个在字符串结尾
4.建立一个while循环,当left < right时执行循环
如果在任意地点s[left] !== s[right],则返回false
否则left++,right--,继续执行循环
5.当循环完成后都没有返回false,则返回true
Java:
public boolean isPalindrome(String s) {
if(s.isEmpty()) {
return true;
}
int left = 0;
int right = s.length() - 1;
while(left < right) {
if(!Character.isLetterOrDigit(s.charAt(left))) {
left++;
continue;
}
if(!Character.isLetterOrDigit(s.charAt(right))) {
right--;
continue;
}
if(Character.toLowerCase(s.charAt(left)) !=
Character.toLowerCase(s.charAt(right))) {
return false;
}
left++;
right--;
}
return true;
}
JavaScript:
var isPalindrome = function(s) {
s = s.toLowerCase().replace(/[\W_]/g, "");
if(s.length < 2) {
return true;
}
let left = 0;
let right = s.length - 1;
while(left < right) {
if(s[left] !== s[right]) {
return false;
}
left++;
right--;
}
return true;
};
680.题目描述:
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
解析:
在上一题的基础上,多加了一个判断,left + 1是否等于right,right - 1是否等于left
Java:
public boolean validPalindrome(String s) {
int left = 0, right = s.length() - 1;
while(left < right) {
if(s.charAt(left) != s.charAt(right)) {
boolean result = isPalindrome(s, left + 1, right)
|| isPalindrome(s, left, right - 1);
return result;
}
left++;
right--;
}
return true;
}
public boolean isPalindrome(String s, int left, int right) {
while(left < right) {
if(s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
JavaScript:
var validPalindrome = function(s) {
let left = 0, right = s.length - 1;
while(left < right) {
if(s[left] !== s[right]) {
const result = isPalindrome(left + 1, right) || isPalindrome(left, right - 1);
return result;
}
left++;
right--;
}
return true;
function isPalindrome(left, right) {
while(left < right) {
if(s[left] !== s[right]) {
return false;
}
left++;
right--;
}
return true;
}
};