125. 验证回文串
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
输入输出
1 2 3 4 5 6 7
| 输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
|
基本思路
- 方法一:新建一个
StringBuffer
保存一个reverse()
之后的字符串 比较 记得处理数字和大小写
- 方法二:直接在原字符串
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
| 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()); } }
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'); } }
|