zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    算法训练 表达式计算
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    New ways to verify that Multipath TCP works through your network
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Multipath TCP Port for Android 4.1.2
    How to enable ping response in windows 7?
    NS3
    Multipath TCP Port for Android
  • 原文地址:https://www.cnblogs.com/warcraft/p/9358858.html
Copyright © 2011-2022 走看看