力扣算法:验证回文串

力扣算法:验证回文串

  • 一、验证回文串
    • 1、问题
    • 2、思路
    • 3、代码
    • 4、时间与空间复杂度
  • 备注

一、验证回文串

1、问题

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

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

示例1:

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

示例2:

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

2、思路

思路一:

  1. 遍历字符串

利用 isalnum() 函数将字符串中的字母和数字筛选出来。

isalnum()函数:
str.isalnum(),如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。

将筛选出来的大写字母利用 lower() 函数全部转换为小写。

lower()函数:
str.lower(),返回将字符串中所有大写字符转换为小写后生成的字符串。

  1. 将“此字符串”与“此字符串的逆序”进行对比,如果相同(是回文串)返回True,相反(不是回文串)则返回Flase。

思路二

  1. 对字符串进行遍历筛选,只保留字母和数字,并将字符串中的大写字母转换为小写。
  2. 设置两个指针left 和right,分别指向字符串的前端和尾部。
  3. 建立一个循环,循环条件为left < right。如果str[left] != str[right],说明此字符串不是回文,则返回False ;相反left和right都向中间走一步。
  4. 如果left和right相遇,说明遍历结束且字符串为回文串,返回True.

3、代码

#coding:utf-8
class Solution:
    def isPalindrome1(self, s1: str) -> bool:
        s_screened1 = "".join(s_o1.lower() for s_o1 in s1 if s_o1.isalnum())
        return s_screened1 == s_screened1[::-1]  

    def isPalindrome2(self, s2: str) -> bool:
        s_screened2 = "".join(s_o2.lower() for s_o2 in s2 if s_o2.isalnum())
        n = len(s_screened2)-1
        left,right = 0,n
        while left < right:
            if s_screened2[left] != s_screened2[right]:
                return False
            left,right = left+1,right-1
        return True

if __name__ == "__main__":
    s = "A man, a plan, a canal: Panama"
    #s = "race a car"

    sl = Solution()
    print(sl.isPalindrome1(s))
    print(sl.isPalindrome2(s))

4、时间与空间复杂度

时间复杂度:O(n)
其中 n 是字符串 s 的长度。

空间复杂度:O(n)
由于我们需要将所有的字母和数字字符存放在另一个字符串中,在最坏情况下,新的字符串 s_screened 与原字符串 s 完全相同,因此需要使用 O(n) 的空间。

备注

1、参考:
LeetCode-Solution
https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/

你可能感兴趣的:(力扣算法,python,leetcode,字符串)