LeetCode.680. 验证回文字符串 Ⅱ

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

输入: “aba”
输出: True

示例 2:

输入: “abca”
输出: True
解释: 你可以删除c字符。

注意:

字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

思路1:

最直接思路,直接比较字符串在-1步长处理后是否和原字符串相等,若不是,则逐一删除一个字符,判断其是否回文。
此思路在Python下无法处理超长字符串。

代码1:

class Solution:
    def judge(self,s):
        return True if s==s[::-1] else False
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if s=='':
            return False
        if self.judge(s):
            return True
        for i in range(len(s)):
            if self.judge(s[:i]+s[i+1:]):
                return True

思路2:

使用双指针技术。若是一个长度为n的字符串回文,则总计判断次数为(n+1)//2-1,据此使用双指针判断判断次数。若本字符串不是回文,则有两种选择,一是跳过第i个继续比较,二是跳过n-1-i个继续比较。

代码2:

class Solution:
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        n=len(s)
        cmptime=(n+1)//2-1
        i=0
        while i<cmptime and s[i]==s[n-1-i]:
            i+=1
        if i==cmptime:
            return True
        if s[i]==s[n-1-i-1]:
            while i<cmptime and s[i]==s[n-1-i-1]:
                i+=1
        if s[i+1]==s[n-1-i]:
            while i<cmptime and s[i+1]==s[n-1-i]:
                i+=1
        if i==cmptime:
            return True
        return False

分析2:

相对于思路一,每个字符串只需要被扫描一次。
时间复杂度O(n),空间复杂度O(1)

猜你喜欢

转载自blog.csdn.net/u013942370/article/details/82915832
今日推荐