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!

  • 相关阅读:
    Python进制转换
    Python matplotlib笔记
    Python Numpy,Pandas基础笔记
    Android调用WebService
    逻辑回归 Logistic Regression
    奇异值分解 SVD
    Laravel 队列不执行的原因,job缓存
    Vim使用技巧(0) -- 博主的vim配置
    Vim使用技巧(5) -- 宏的录制与使用
    linux crontab 鉴定令牌不再有效,需要新的鉴定令牌 [ You (root) are not allowed to access to (crontab) because of pam configuration.]
  • 原文地址:https://www.cnblogs.com/warcraft/p/9358858.html
Copyright © 2011-2022 走看看