LeetCode-125-验证回文串

每天一道LeetCode题目总结。

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

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

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome

执行用时:8 ms, 在所有 C++ 提交中击败了85.02%的用户

内存消耗:7.2 MB, 在所有 C++ 提交中击败了100.00%的用户

class Solution {
public:
    bool isPalindrome(string s) {
        int len = s.length();
        int i = 0,j = len-1;
        while(i='a' && (s[i]|32)<='z')|| (s[i]>='0' &&  s[i]<='9')))i++;
            while(j>i && !(((s[j]|32)>='a' && (s[j]|32)<='z')|| (s[j]>='0' &&  s[j]<='9')))j--;
            if(i>=j)break;
            if((s[i]|32) != (s[j]|32))return false;
            i++;
            j--;
        }
        return true;
    }
};
//"0P"
//"A man, a plan, a canal: Panama"
//"race a car"
//"aBc**o**Cba"

1、这道题目属于简单题目类别,自己感觉还是比较简单。

2、大概的算法过程:

双指针i,j从两头判断是否为数字或者字符,如果是则拿出来比较是否相等,不相等返回false,相等则继续,直到结束。

3、边界的问题:为什么i>=j结束循环,并且返回true

如果是内部的while循环到i==j,这是s[i]==s[j],s[i]和s[j]要么是字符或者数字,要么不是。如果是第一种,那么剩下一个单独的s[i]就一定是回文,因为s[i]两边的已经是回文了,所以就是回文,如果是第二种,就肯定也是回文了。

4、关于字母字符大小写转换的问题:

现在很多人可能将大写字母变换为小写字母是:ch = ch + 32,然后小写字母变大写字母:ch = ch - 32;

这样的前提是我们已知ch是大写字母还是小写字母,那要是不知道呢。这里提供一些方法来在大写字母和小写字母的变换:

字母大小写转换可以使用位运算:
大写变小写、小写变大写 : 字符 ch^= 32;
大写变小写、小写变小写 : 字符 ch|= 32;
小写变大写、大写变大写 : 字符 ch&= -33;

5、数字字符ch使用ch|=32运算结果不变,ch='9';ch|=32://ch还是‘9’

6、其他非字母字符使用ch|=32结果不会出现字母字符。

7、(ch|32)要括起来,优先级比较严格。

你可能感兴趣的:(LeetCode)