LeetCode 5. Longest Palindromic Substring & 回文字符串

Longest Palindromic Substring

回文这种简单的问题,在C里面印象很深啊。希望能一次过。

写的时候才想到有两种情况:

454(奇数位)
4554(偶数位)
第1次提交
class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        print(s)
        maxPadStr=''
        # traverse each char 
        l=len(s)
        for i,c in enumerate(s):

            # left or right extend test
            # j is length
            j=1
            while j <= l/2:

                # left or right str
                leftStr=s[i:i-j:-1] if (i-j)>=0 else  s[i::-1]
                rightStr=s[i:i+j]  # odd
                rightStr2=s[i+1:i+j+1] # even
                # length
                leftLen=len(leftStr)
                rightLen=len(rightStr)

                print(i,j,'left:',leftStr,'right:',rightStr,'right-even:',rightStr2)

                if leftLen != rightLen:
                    break
 
                if leftStr == rightStr and len(leftStr)*2-1>=len(maxPadStr):
                    #odd bit 
                    maxPadStr=(leftStr[:0:-1]+rightStr) # 654,654 -> 45654
                    #print('odd',maxPadStr)
                
                # 'cbbd' 时,left: b right: b right-even: b. odd even 都存在,但上面只会b,所以存在偶数位相等故不能elif
                if leftStr == rightStr2 and len(leftStr)*2>=len(maxPadStr):
                    #even bit
                    maxPadStr=(leftStr[::-1]+rightStr2) # 654,654 -> 456654
                    #print('even',maxPadStr)
                j+=1

        return maxPadStr
if __name__ == "__main__":
    
    data = [
        {
            "input":"babad",
            "output":"bab", # /'aba'
        },{
            "input":"cbbd",
            "output":"bb"
        },{
            "input":"123456654",
            "output":"456654"
        },{
            "input":"14565422",
            "output":"45654"
        }

    ];
    for d in data:
        result=Solution().longestPalindrome(d['input'])
        print(result)
        if result==d['output']:
            print("--- ok ---")
        else:
            print("--- error ---")

Wrong Answer:

Input:
"a"
Output:
""
Expected:
"a"

咦,这种一个字母早都考虑到了啊。
出在了while的条件上:j <= l/2: 哈哈,一半长度的直观出发哈哈哈l/2,没错,只是把1个字符就排除掉了,改成这样j<=l//2+1

第2次提交
pass
    while j <= l//2+1:
        pass

Accepted!

posted @ 2018-07-24 11:07  姜小豆  阅读(86)  评论(0编辑  收藏  举报