📜  数据结构|杂项|问题8(1)

📅  最后修改于: 2023-12-03 15:10:20.202000             🧑  作者: Mango

数据结构 | 杂项 | 问题8

问题描述

设计一个算法,判断一个字符串是否为回文串。

回文串是指正序和倒序读都相同的字符串,例如 "racecar"。

解决方案
1. 直接遍历判断

通过遍历判断字符串的前半部分和后半部分是否相同,需要注意字符串长度为奇偶的情况。

def is_palindrome(s: str) -> bool:
    n = len(s)
    for i in range(n // 2):
        if s[i] != s[n - i - 1]:
            return False
    return True

时间复杂度为 O(n),空间复杂度为 O(1)。

2. 双指针判断

同样是通过判断字符串前半部分和后半部分是否相同,但是使用两个指针从前后同时遍历字符串。

def is_palindrome(s: str) -> bool:
    i, j = 0, len(s) - 1
    while i < j:
        while i < j and not s[i].isalnum():
            i += 1
        while i < j and not s[j].isalnum():
            j -= 1
        if s[i].lower() != s[j].lower():
            return False
        i += 1
        j -= 1
    return True

时间复杂度为 O(n),空间复杂度为 O(1)。

3. 库函数判断

使用 Python 自带的库函数 re.sub()str.lower() 转换大小写和替换特殊字符。

import re

def is_palindrome(s: str) -> bool:
    s = re.sub('[^0-9a-zA-Z]', '', s).lower()
    return s == s[::-1]

时间复杂度为 O(n),空间复杂度为 O(n)。

总结

以上三种方法都可以判断字符串是否为回文串,根据实际情况选择不同的方法。其中直接遍历判断方法最简单,使用库函数判断方法最简洁。