- 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
class Solution {
public boolean isPalindrome(String s) {
char[] arr = new char[s.length()];
int index = 0;
// 处理成一个小写字符和数字组成的数组
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')|| ('0' <= c && c <= '9')){
arr[index++] = 'A' <= c && c <= 'Z' ? (char)(c - 'A' + 'a'): c;
}
}
int l = 0,r = index - 1;
// 验证是否是回文
while (l < r) {
if (arr[l] != arr[r]) return false;
l++;
r--;
}
return true;
}
}
- 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 你可以删除c字符。
示例 3:
输入: s = "abc"
输出: false
class Solution {
// 删除一次
private boolean valotile = false;
public boolean validPalindrome(String s) {
return check(0,s.length() - 1,s);
}
public boolean check(int l,int r,String s){
// System.out.println(l+";"+r);
while (l < r) {
// System.out.println(l+" l="+s.charAt(l) +" "+r +" r=" +s.charAt(r) );
// 不相等的时候判断
if (s.charAt(l) != s.charAt(r)){
// 左边下标+1 判断是否是回文
if (!valotile && l + 1 <= r && s.charAt(l + 1) == s.charAt(r)) {
// 跳过一次错误设置为true
valotile = true;
if(check(l + 1,r,s)) return true;;
// 还原状态
valotile = false;
}
// System.out.println("rrrrrrrrrrrrrrrrr "+l+" l="+s.charAt(l) +" "+r +" r=" +s.charAt(r - 1) );
// 右边下标-1 判断是否是回文
if (!valotile && l <= r - 1 && s.charAt(l) == s.charAt(r - 1)){
// 跳过一次错误设置为true
valotile = true;
if(check(l,r - 1,s)) return true;;
}
return false;
}
l++;
r--;
}
return true;
}
}