验证回文字符串

作者: coder_flag | 来源:发表于2018-09-12 22:37 被阅读2次

    原题:

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

    说明:本题中,我们将空字符串定义为有效的回文串。

    示例 1:

    输入: "A man, a plan, a canal: Panama"
    输出: true
    

    示例 2:

    输入: "race a car"
    输出: false
    

    解法1:

    思路:先去除标点符号,以及空格,把字符串都变成小写,因为后面需要字符串前后对比;转换成字符数组,首尾开始往中间依次对比,相同则是回文。

    class Solution {
       public  boolean isPalindrome(String s) {
            s=s.replaceAll("[\\pP\\p{Punct}]" , "");
            s=s.replaceAll(" +" , "");
            s=s.toLowerCase();
            char[] array=s.toCharArray();
            int n=array.length;
            for(int i=0;i<n/2;i++){
                if(array[i]!=array[n-1-i]){
                    return false;
                }
            }
            return true;
        }
    }
    

    解法2:

    思路:这题的重点就是去除这些标点符号的干扰,下面这个算法就是写一个函数判断是否为数字或字母,在前后对比时,先判断是否为数字或字母,是就舍弃移位。这样做就省去了对字符串的各种操作了。

    class Solution {
    public:
        bool isPalindrome(string s) {
            int left = 0, right = s.size() - 1 ;
            while (left < right) {
                if (!isAlphaNum(s[left])) ++left;
                else if (!isAlphaNum(s[right])) --right;
                else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
                else {
                    left++;
                    right--;
                }
            }
            return true;
        }
        bool isAlphaNum(char &c) {
            if (c >= 'a' && c <= 'z') return true;
            if (c >= 'A' && c <= 'Z') return true;
            if (c >= '0' && c <= '9') return true;
            return false;
        }
    };
    

    BB一句:

    注意:
    1 、s=s.replaceAll("[\pP\p{Punct}]" , ""); 去除标点作用

    相关文章

      网友评论

        本文标题:验证回文字符串

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