问题描述
定义回文串是去除字符串中非字母和数字的其他字符后,将大写字母转成小写字母后,从左到右显示和从右到左显示是相同的字符串。给定一个字符串,要求判断其是否是回文串。题目链接:点我
样例输入输出
输入:s = “A man, a plan, a canal: Panama”
输出:true
解释:取出非字母和空格并将大写字母转成小写字母后,字符串是“amanaplanacanalpanama”
输入:s = “race a car”
输出:false
解释:取出非字母和空格并将大写字母转成小写字母后,字符串是“raceacar”
问题解法
此题比较简单,使用双指针进行遍历判断,过滤掉非字母和数字的字符即可。代码如下
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
| class Solution { public boolean isPalindrome(String s) { int left = 0; int right = s.length() - 1; while (left < right) { if (!isValidChar(s.charAt(left))) { left++; continue; }
if (!isValidChar(s.charAt(right))) { right--; continue; }
if (!isEqual(s.charAt(left), s.charAt(right))) { return false; }
left++; right--; } return true; }
private boolean isValidChar(char ch) { return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); } private boolean isEqual(char first, char second) { if (first >= 'A' && first <= 'Z') { first = (char) (first - 'A' + 'a'); } if (second >= 'A' && second <= 'Z') { second = (char) (second - 'A' + 'a'); } return first == second; } }
|