问题
给定一个字符串,判断该字符串是否为回文。只考虑字母和数字,忽略大小写。
回文:一个字符串无论正序读或倒序读都相同
思路
第一种:利用双指针(效率高)
通过双指针判断,被操作的字符是否为字母和数字,并且左右两边字符是否相等。
第二种:递归(效率低)
对第一种方式进行改造,通过递归方式实现。
第三种:正则(效率最差)
1)通过正则对原字符串进行过滤,只留下字母和数字并转换为小写,生成新的字符串。
2)将新生成的反转。
3)比较新旧两个字符串是否相等。
实现
第一种:双指针
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length()-1;
while (left<right){
while (left<right && !Character.isLetterOrDigit(s.charAt(left))){
left++;
}
while (left<right && !Character.isLetterOrDigit(s.charAt(right))){
right--;
}
if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){
return false;
}
left++;
right--;
}
return true;
}
}
image.png
第二种:递归
class Solution {
public boolean isPalindrome(String s) {
return isPalindromeHandler(s,0,s.length()-1);
}
public boolean isPalindromeHandler(String s,int left,int right){
if(left>=right){
return true;
}
while(left<right && !Character.isLetterOrDigit(s.charAt(left))){
left++;
}
while(left<right && !Character.isLetterOrDigit(s.charAt(right))){
right--;
}
return Character.toLowerCase(s.charAt(left)) == Character.toLowerCase(s.charAt(right)) && isPalindromeHandler(s,++left,--right);
}
}
image.png
第三种:正则实现
class Solution {
public boolean isPalindrome(String s) {
String newS = s.replaceAll("[^A-Za-z0-9]","").toLowerCase();
String newRevS = new StringBuilder(newS).reverse().toString();
return newS.equals(newRevS);
}
}
image.png
网友评论