125. 验证回文串

题目描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

输入输出

1
2
3
4
5
6
7
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

基本思路

  1. 方法一:新建一个StringBuffer保存一个reverse()之后的字符串 比较 记得处理数字和大小写
  2. 方法二:直接在原字符串 s 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//方法一 时复O(n)空复O(n) n是字符串长度
class Solution {
public boolean isPalindrome(String s) {
StringBuffer temp = new StringBuffer();
int length = s.length();
for(int i = 0; i < length; i++) {
char ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
temp.append(Character.toLowerCase(ch));
}
}
StringBuffer temp2 = new StringBuffer(temp).reverse();
return temp.toString().equals(temp2.toString());
}
}

//方法二 时复O(n)空复O(1)
class Solution {
public boolean isPalindrome(String s) {
char[] c = s.toLowerCase().toCharArray();
int left = 0, right = c.length - 1;
while(left < right) {
while(left < right && !isValid(c[left])){
left++;
}
while(left < right && !isValid(c[right])){
right--;
}
if(c[left] != c[right]){
return false;
}
left++;right--;
}
return true;
}

public boolean isValid(char ch){
return (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9');
}
}