美文网首页
每日两道算法题 - 判断回文(高频)

每日两道算法题 - 判断回文(高频)

作者: 辉_ace | 来源:发表于2021-12-19 22:20 被阅读0次

问题

给定一个字符串,判断该字符串是否为回文。只考虑字母和数字,忽略大小写。
回文:一个字符串无论正序读或倒序读都相同

思路

第一种:利用双指针(效率高)

通过双指针判断,被操作的字符是否为字母和数字,并且左右两边字符是否相等。

第二种:递归(效率低)

对第一种方式进行改造,通过递归方式实现。

第三种:正则(效率最差)

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

相关文章

网友评论

      本文标题:每日两道算法题 - 判断回文(高频)

      本文链接:https://www.haomeiwen.com/subject/jutafrtx.html