LeetCode算法题125:验证回文串解析

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例1:

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

示例2:

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

这个题首先的想法是先把所有字符转换成小写,然后取出所有字母数字,然后反向对比,但是这样一般的思路来说要进行三次循环,事实上完全可以走一次循环完成。左右两边开始遍历,如果左边或者右边不是字母数字,那就更新索引,如果都是字母或数字,则进行对比(这里要进行大小写转换的操作),不相等就返回false,相等则继续对比,直到两个索引相等。
C++源代码:

class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0;
        int right = s.size() - 1;
        while(left < right){
            if (!isalnum(s[left])) left++;
            else if (!isalnum(s[right])) right--;
            else if ((s[left]+32-'a')%32 != (s[right]+32-'a')%32) return false;
            else{
                left++;
                right--;
            }
        }
        return true;
    }
};

python3源代码:

class Solution:
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        left = 0
        right = len(s) - 1
        while left < right:
            if not s[left].isalnum():
                left += 1
            elif not s[right].isalnum():
                right -= 1
            elif s[left].upper() != s[right].upper():
                return False
            else:
                left += 1
                right -= 1
        return True

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/83817713