给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
提示:
- 1 <= s.length <= 2 * 105
- 字符串 s 由 ASCII 字符组成
思路 :双指针
初始时,左右指针分别指向 s 的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,先判断指针指向的是字母或数字字符,如果是,就判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明字符串 s 是回文串
class Solution {
public boolean isPalindrome(String s) {
String c = s.toLowerCase();
int i=0, j=c.length()-1;
while(i<=j){
while(!isValid(c.charAt(i)) && i<j){
++i;
}
while(!isValid(c.charAt(j)) && i<j){
--j;
}
if(c.charAt(i) == c.charAt(j)){
++i;
--j;
}else{
return false;
}
}
return true;
}
//可替换Character.isLetterOrDigit
private boolean isValid(char c){
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
}
}
复杂度分析
- 时间复杂度:O(|s|),其中 ∣s∣ 是字符串 s 的长度。
- 空间复杂度:O(1)。