【leetcode】Valid Palindrome II

很久没有做题了,今天写个简单难度的练练手感。

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

Example 1:
Input: "aba"
Output: True
Example 2:
Input: "abca"
Output: True

Explanation: You could delete the character 'c'. Note: The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

分析:这个题目的要求是判断回文,但是增加了一点难度,可以删掉至多一个字符。所以,我们可以从字符串的两头往中间进行每个字符的比较。先比较s[0]和s[len(s)-1],如果相同的话,低位+1,高位-1,直到找到两个字符不同为止。因为可以删除一个字符,所以还需要判断s[低位+1] == s[高位] 和 s[低位] == s[高位-1],如果满足其中一个条件,那么对应位置+1或者-1继续比较。如果两个都满足,我的方法是先比较s[低位] == s[高位-1],如果不是回文,再来比较s[低位+1] == s[高位]。

代码:

class Solution(object):
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        low = 0;
        high = len(s)-1
        isDel = False
        fisrtFlag = false
        firstLow = 0
        firstHigh = 0
        ret = True
        while low < high:
            if s[low] == s[high]:
                low += 1
                high -= 1
                continue
            else:
                if isDel == True:
                    ret = False
                    break
                if s[low] != s[high-1] and s[low+1] != s[high]:
                    ret = False
                    break
                elif s[low] == s[high-1]:
                    firstLow = low
                    firstHigh = high-1
                    fisrtFlag = True
                    high -= 1
                    isDel = True
                elif s[low+1] == s[high]:
                    low += 1
                    isDel = True
#再比较异常
if ret == False and fisrtFlag == True: ret = True low = firstLow + 1 high = firstHigh + 1 while low < high: if s[low] == s[high]: low += 1 high -= 1 continue else: ret = False break return ret
原文地址:https://www.cnblogs.com/seyjs/p/7576043.html