问题描述

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

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

示例 1:

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

输入: “race a car” 输出: false

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.1、基本解法

  首先将字符串转成小写,之后提取出字符串中的数字和字母。比较前半段和后半段内容是否相等。

1.2、代码
# -*- coding: utf-8 -*-
'''
题目简述:
    给定一个字符串,验证其是否是回文串。仅考虑字母和数字。
基本思路:
    首先将字符串中中所有元素转成小写,然后提取出数字和字母。
    在结合python切片比较前后两半段是否相等。
'''

class Solution():
    def isString(self,s):
        if len(s) < 2:
            return True
        s = s.lower()          # 转成小写
        slist = []
        for word in s:
            if word.isalnum(): # 若是小写or字母
                slist.append(word)
        mid = len(slist) // 2
        if slist[:mid] == slist[::-1][:mid]:
            return True
        return False
    
if __name__ == '__main__':
    s = 'aba'
    solu = Solution()
    res = solu.isString(s)
    print('结果为\n',res)
2.1、双指针解法

  建立前后两个指针,比较两个指针对应的元素是否相等。直至比较两个指针相遇。

2.2、代码
# -*- coding: utf-8 -*-
'''
题目简述:
    给定一个字符串,验证其是否是回文串。仅考虑字母和数字。
基本思路:
    设置两个指针,比较元素是否相等,直至两个指针碰头。
'''

class Solution():
    def isString(self,s):
        if len(s) < 2:
            return True
        s = s.lower()   
        left = 0
        right = len(s) -1
        # 开始比较
        while left < right:
            if not s[left].isalnum(): # 若不是字母或数字
                left+=1
                continue
            if not s[right].isalnum():
                right-=1
                continue
            if s[left].isalnum() and s[right].isalnum():
                if s[left] != s[right]:
                    return False
                else:
                    left+=1
                    right-=1
        return True
if __name__ == '__main__':
    s = "A man, a plan, a canal: Panama"
    solu = Solution()
    res = solu.isString(s)
    print('结果为\n',res)
总结

a. 方法一中 : 验证一个字符是否是 数字or字母: 调用现成api。word.isalnum(); 另外,比较前后两半段是否相等。主要是后半段的处理很巧妙。先将字符串倒序然后比较前mid个元素。这样保证了前后两半段待比较元素数量相同。而不会因为字符串中字母的奇数偶数数量而出差。
b. 不论法一还是法二: 均存在一个细节。即 s = s.lower(),仅仅在程序中s.lower()并不会改变原始字符串。实质上开辟了一块新内存。因此,必须赋值给s。否则不起作用。