🐕给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
示例 2:
输入: “race a car”
输出: false
解释:“raceacar” 不是回文串
提示:
1 <= s.length <= 2 * 10的5次方
字符串 s 由 ASCII 字符组成
🐖思路:
先将字符串转化为小写字符 转成 字符数组
去掉特殊字符和空格 存入res字符数组
再从 res字符数组 利用双指针 判断是否回文
上代码
public static boolean isPalindrome(String s) {
// 如果字符串为空 也是回文字符串
if( s == null || s.equals("")) {
return true;
}
//将字符串转化为小写字符 转成 字符数组
char[] charArray = s.toLowerCase().toCharArray();
//去掉特殊字符和空格 存入res字符数组
char[] res = new char[charArray.length];
int index = 0; // res数字的指针
for(int i = 0 ; i < charArray.length ; i++) {
//如果符合 a ~ z 和 数字 1 ~ 9
if(charArray[i] >= 97 && charArray[i] <= 122 || (charArray[i] >= 48 && charArray[i] <= 57)) {
res[index++] = charArray[i];
}
}
//再从 res字符数组 利用双针 判断是否回文指
for(int i = 0,j = index -1; i < j; i++,j--) {
if(res[i] != res[j]) {
return false;
}
}
return true;
}
🐒思路二:
省空间做法:将字符串转为字符数组后 双指针判断 该字符 是否符合条件的同时 判断是否符合回文
上代码
public static boolean isPalindromeV2(String s) {
// 如果字符串为空 也是回文字符串
if( s == null || s.equals("")) {
return true;
}
//将字符串转化为小写字符 转成 字符数组
char[] charArray = s.toLowerCase().toCharArray();
//双指针判断该字符 是否符合条件的同时 判断是否符合回文
for(int i = 0,j = charArray.length -1; i < j; i++,j--) {
while(i < j && !((charArray[i] >= 97 && charArray[i] <= 122) || (charArray[i] >= 48 && charArray[i] <= 57))) {
i++;
}
while(i < j && !((charArray[j] >= 97 && charArray[j] <= 122) || (charArray[j] >= 48 && charArray[j] <= 57))) {
j--;
}
if( charArray[i] != charArray[j]) {
return false;
}
}
return true;
}