# 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真的老泪纵横!