Fork me on GitHub

leetcode——[125]Valid Palindrome验证回文串

题目

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

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

示例 1:

1
2
输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

1
2
输入: "race a car"
输出: false

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

1
2
Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:

1
2
Input: "race a car"
Output: false

解题方法

头尾扫描,借用getCharType方法判断字符的类型,非数字字母字符则跳过,大写字母则转化为小写字母,从而获得头尾两个数字字母类型字符。然后判断头尾字符是否相等,不相等则返回False,直到头尾相遇返回True。这段代码跑了6ms,超过了92.68%的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
41
42
43
44
45
46
47
48
49
public class Solution {
// Method 1 6ms 92.68%
public boolean isPalindrome(String s) {

char[] chars = s.toCharArray();

for (int head = 0, tail = s.length() - 1; head < tail; head++, tail--){
while (getCharType(chars[head]) == 2) {
head++;
if (head == tail) {
return true;
}
}

while (getCharType(chars[tail]) == 2) {
tail--;
if (head == tail) {
return true;
}
}

if (getCharType(chars[head]) == 1) {
chars[head] += 'a' - 'A';
}

if (getCharType(chars[tail]) == 1) {
chars[tail] += 'a' - 'A';
}

if (chars[head] != chars[tail]) {
return false;
}
}

return true;
}

public int getCharType(char c) {
if (c >= '0' && c <= '9' || (c >= 'a' && c <= 'z')) {
return 0;
}
else if (c >= 'A' && c <= 'Z') {
return 1;
}
else {
return 2;
}
}
}

共勉

今日事,今日毕。

BJTU-HXS wechat
海内存知己,天涯若比邻。