leetcode第 5题

# coding=utf-8
# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
def log(func):
    def wrap(*args,**kwargs):
        print 'call %s'%func.__name__
        func(*args,**kwargs)
    return wrap

class Solution(object):
    @log
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        三个指针i,j,k
        长度0,1,2
        长度3 i=0,j=1,k=2
        for j in range(1,len(s)):
        while s[i]==s[k]:
        i--
        k++
        !!!
        完了操,双数回文怎么弄啊,一开始我也没考虑到啊!!!
        !!!
        1.三个指针往前走,一旦s[i]==s[j]
        把ij放入函数
        如果s[i]==s[k]
        可ik放入函数
        def func(i,k/j):
            return ii,jj
        """
        @log
        def palindromic(ii,kk,s):
            list_curr=[1,0,0]
            while s[ii] == s[kk]:  # 相等时一直循环
                print '进入while'
                ii -= 1
                kk += 1
                if ii == -1:  # 如果i碰到前边
                    print '碰到前边'
                    break
                elif kk == len(s):
                    print '后边'
                    break
                else:  # 没到边继续移动
                    print '没碰到边ii=%s,kk=%s' % (ii, kk)
            ii += 1
            kk -= 1
            len_curr = kk - ii+1  # 记录不相等此时的长度,长度如果大于上一个,更新长度,更新脚标
            list_curr[0] = len_curr
            list_curr[1] = ii
            list_curr[2] = kk
            print 'list_curr=%s' % list_curr
            return list_curr


        if len(s)==1:#长度为1
            return s
        elif len(s)==2:#长度为2
            if s[0]==s[1]:
                return s
            else:
                return s[0]
        else:#长度大于2
            i=-1
            j=0
            k=1
            list_last=[1,0,0]
            for j in range(1,len(s)-1):#j开始移动,i,k跟随移动
                i+=1
                k+=1
                print 'i=%s,j=%s,k=%s'%(i,j,k)
                if s[i]==s[j]:#其实到这里我已经深深的觉得其实真的可以把开始回文的部分写一个函数了!!!!!
                    print '双'
                    list_curr_ij=palindromic(i,j,s)
                    print list_curr_ij
                    if list_curr_ij[0]>list_last[0]:
                        list_last=list_curr_ij

                    else:
                        pass
                elif s[i]==s[k]:#如果出现前后相等时即最少回了三个,i,k一定要先传给新的参数再继续向两边移动防止移动结束后ik出现改变,回两个怎么办啊!
                    print '单'
                    list_curr_ik=palindromic(i,k,s)
                    if list_curr_ik[0]>list_last[0]:
                        list_last=list_curr_ik

                    else:
                        pass
                else:
                    pass
            return s[list_last[1]:list_last[2]+1]
s=Solution()
print s.longestPalindrome("cebaabd")

讲道理完全遭遇了神奇的事情:上边的代码运行出来报了个错

C:\Users\Administrator\PycharmProjects\pythonProject2\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/pythonProject2/main.py
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/pythonProject2/main.py", line 97, in <module>
    print s.longestPalindrome("cebaabd")
  File "C:/Users/Administrator/PycharmProjects/pythonProject2/main.py", line 9, in wrap
    func(*args,**kwargs)
  File "C:/Users/Administrator/PycharmProjects/pythonProject2/main.py", line 80, in longestPalindrome
    if list_curr_ij[0]>list_last[0]:
TypeError: 'NoneType' object has no attribute '__getitem__'
call longestPalindrome
i=0,j=1,k=2
i=1,j=2,k=3
i=2,j=3,k=4
i=3,j=4,k=5
双
call palindromic
进入while
没碰到边ii=2,kk=5
进入while
没碰到边ii=1,kk=6
list_curr=[4, 2, 5]
None

Process finished with exit code 1

我百思不得其解的时候发现会不会是装饰器

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        三个指针i,j,k
        长度0,1,2
        长度3 i=0,j=1,k=2
        for j in range(1,len(s)):
        while s[i]==s[k]:
        i--
        k++
        !!!
        完了操,双数回文怎么弄啊,一开始我也没考虑到啊!!!
        !!!
        1.三个指针往前走,一旦s[i]==s[j]
        把ij放入函数
        如果s[i]==s[k]
        可ik放入函数
        def func(i,k/j):
            return ii,jj
        """
        def max_ind(a,b):#临时写个函数用来返回三个list表里边最大的
            if a[0]>=b[0]:
                return a
            else:
                return b
        def palindromic(ii,kk,s):
            list_curr=[1,0,0]
            while s[ii] == s[kk]:  # 相等时一直循环
                ii -= 1
                kk += 1
                if ii == -1:  # 如果i碰到前边
                    break
                elif kk == len(s):
                    break
                else:  # 没到边继续移动
                    pass
            ii += 1
            kk -= 1
            len_curr = kk - ii+1  # 记录不相等此时的长度,长度如果大于上一个,更新长度,更新脚标
            list_curr = len_curr,ii,kk
            return list_curr
        if len(s)==1:#长度为1
            return s
        elif len(s)==2:#长度为2
            if s[0]==s[1]:
                return s
            else:
                return s[0]
        else:#长度大于2
            i=-1
            j=0
            k=1
            list_last=[1,0,0]
            for j in range(1,len(s)-1):#j开始移动,i,k跟随移动
                i+=1
                k+=1
                if s[i]==s[k] and s[i]!=s[j]:#如果出现前后相等时即最少回了三个,i,k一定要先传给新的参数再继续向两边移动防止移动结束后ik出现改变,回两个怎么办啊!
                    list_curr_ik=palindromic(i,k,s)
                    if list_curr_ik[0]>list_last[0]:
                        list_last=list_curr_ik
                    else:
                        pass
                elif s[i]==s[k]==s[j]:#头尾指针相等有个问题就是如果三个指针的数值都相等,即bbbb这种类型,如果直接判断成3回文的那最长只能是3,所以碰到bbb这种直接让他ij进去一次回文,ik进去一次回文。
                    list_curr_ij=palindromic(i,j,s)
                    list_curr_ik=palindromic(i,k,s)
                    list_last=max(max_ind(list_curr_ij,list_curr_ik),list_last)

                elif s[i]==s[j]:#其实到这里我已经深深的觉得其实真的可以把开始回文的部分写一个函数了!!!!!
                    list_curr_ij=palindromic(i,j,s)
                    print list_curr_ij
                    if list_curr_ij[0]>list_last[0]:
                        list_last=list_curr_ij
                    else:
                        pass
                elif s[k] == s[j]:  # 其实到这里我已经深深的觉得其实真的可以把开始回文的部分写一个函数了!!!!!
                    list_curr_jk = palindromic(j, k, s)
                    if list_curr_jk[0] > list_last[0]:
                        list_last = list_curr_jk
                    else:
                        pass
                else:
                    pass
            return s[list_last[1]:list_last[2]+1]

的问题,于是去掉了装饰器真的能运行了,我tm真的老泪纵横!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值