验证回文字符串

原题:

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

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

示例 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}]” , “”); 去除标点作用

    原文作者:coder_flag
    原文地址: https://www.jianshu.com/p/426345f49091
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞