125. Valid Palindrome
https://leetcode.com/problems/valid-palindrome/
Description
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:
Input: “A man, a plan, a canal: Panama”
Output: true
Example 2:
Input: “race a car”
Output: false
Solutions
- 我的思路1:
- 去掉空格
str.replace(" ", "");
- 转为小写
toLowerCase();
- 用
charAt()
遍历字符串比较,逐个比较前一半s2.length()/2
的长度的字符
- 我的思路2:
- 去掉空格
str.replace(" ", "");
- 将后一半
s.length()/2
的字符串倒序,得到anotherString (倒序懒得写) boolean equalsIgnoreCase(String anotherString)
将前一半s.length()/2
长度的String 与anotherString 比较,不考虑大小写。
public class Solution {
public boolean isPalindrome(String s) {
String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
String rev = new StringBuffer(actual).reverse().toString();
return actual.equals(rev);
}
}
看了人家的答案觉得思路2太复杂了,根本不用把字符串分为两个,Palindrome串reverse之后和原来的没有区别。
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
- 审题错误(处理标点):
"A man, a plan, a canal: Panama"这个例子跑出来是false,发现自己没有处理标点。
replaceAll("\\p{P}", "");
删除标点后,发现`
反单引号无法被删除。
删除/清除/过滤标点(所有中英文标点)的正则表达式
可以按上文中的s.replaceAll( "[\\p{P}+~$`^=|<>~`$^+=|<>¥×]" , "");
来去掉所有标点。
再审题,发现题目要求只处理alphanumeric的字符,可以不删除,只提取。
Java提取字符串中的字母数字
因为是提取,所以也不用处理空格,因为提取的是字母数字,空格不会被提取。
Submissions
class Solution {
public boolean isPalindrome(String s) {
//String s2 = s.replace(" ", "").replaceAll("[^a-z^A-Z^0-9]", "").toLowerCase();不用处理空格
String s2 = s.replaceAll("[^a-z^A-Z^0-9]", "").toLowerCase();
for(int i=0;i<s2.length()/2;i++)
{
if(s2.charAt(i)!=s2.charAt(s2.length()-1-i))
return false;
}
return true;
}
}
Summary
看到discuss版有答案用的Character.isLetterOrDigit,不需要处理字符串,只遍历一遍。