携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
- 1 <= s.length <= 2 * 10^5
- 字符串 s 由 ASCII 字符组成
二、思路分析:
判断回文字符串,使用两个指针分别从首尾遍历,注意除掉非数字字母元素。
如果遇到不是数字字母,可以用while来把指针移动到距离当前位置最近的数字和字母位置,但是外面的while循环没有动,所以之后要重新判断一下i < j。在外面的大while内,先去掉i的非字母数字,如果还满足i < j再去掉j的非字母数字,如果还满足i < j再判断是否一致,不一致退出,一致就移动指针。
class Solution {
public boolean isPalindrome(String s) {
int n = s.length();
if (n == 1) return true;
if (n == 0) return false;
char[] arr = s.toCharArray();
int i = 0, j = n - 1;
while (i < j) {
while (i < j && !Character.isLetterOrDigit(arr[i])) {
i++;
}
while (i < j && !Character.isLetterOrDigit(arr[j])) {
j--;
}
if (i < j) {
if (Character.toLowerCase(arr[i]) != Character.toLowerCase(arr[j])) {
return false;
}
i++;
j--;
}
}
return true;
}
}
也可以用两个if,如果i不是数字字母直接不执行后面的循环体,i++,直到是数字字母;j同理;如果都是数字字母,则判断是否一致,不一致推出,一致就移动指针。这两个if本质上就是把指针移动到离当前位置最近的数字和字母位置,只不过用的是外面的while循环。
class Solution {
public boolean isPalindrome(String s) {
int n = s.length();
if (n == 1) return true;
if (n == 0) return false;
char[] arr = s.toCharArray();
int i = 0, j = n - 1;
while (i < j) {
if (!Character.isLetterOrDigit(arr[i])) {
i++;
continue;
}
if (!Character.isLetterOrDigit(arr[j])) {
j--;
continue;
}
if (Character.toLowerCase(arr[i]) != Character.toLowerCase(arr[j])) {
return false;
}
i++;
j--;
}
return true;
}
}
范文参考:
字符串算法——回文串验证的三大解题办法:双指针 & 新数组 & reverse函数 - 验证回文串 - 力扣(LeetCode)