我一直在第4行得到字符串索引超出范围(if si != send-i:),但是我不知道为什么。我在可视化工具上运行我的代码,但这对我没有帮助。在我输入一个字符串s之后,代码应该给我最长的回文子字符串。
下面是我的代码:
def isSubPalindrome (s,start,end):
isPal = True
for i in range (start,end):
if s[i] != s[end-i]:
isPal = False
return isPal
def longestPalSubsB (s):
MaxLen = 0
for i in range (len(s)-1):
for j in range (i,len(s)-1):
st = ""
for k in range (i,j):
st = st + s[k]
if isSubPalindrome (st,i,j) == True and len(st)>MaxLen:
MaxLen = len (st)
start = i
end = j
return s[start,end]
s = input("Enter a string: ")
print (longestPalSubsB(s))
Enter a string: aceexcivicgrfdds
Traceback (most recent call last):
File "<ipython-input-6-64661b5bf324>", line 1, in <module>
runfile('/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /HW/Homework 4/Problem2b.py', wdir='/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /HW/Homework 4')
File "/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 704, in runfile
execfile(filename, namespace)
File "/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /HW/Homework 4/Problem2b.py", line 35, in <module>
print (longestPalSubsB(s))
File "/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /HW/Homework 4/Problem2b.py", line 24, in longestPalSubsB
if isSubPalindrome (st,i,j) == True and len(st)>MaxLen:
File "/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /HW/Homework 4/Problem2b.py", line 12, in isSubPalindrome
if s[i] != s[end+1-i]:
IndexError: string index out of range
发布于 2019-02-27 04:21:31
Python range(start, end)
给出了一个从start
到end-1
的数字序列。例如,range(10, 14)
是10,11,12,13。现在考虑这个循环:
for i in range (start,end):
if s[i] != s[end-i]:
isPal = False
if
部分,如果使用我的range(10, 14)
示例,则将s[10] != s[14-10]
与s[13] != s[14-13]
进行比较。显然不是你想要做的。
你可能是这个意思:
for i in range(end-start):
if s[start+i] != s[end-i]:
isPal = False
为了解决你的问题,有一个(长长的)一行代码来解决:
print(max([s[i:j+1] for i in range(len(s)) for j in range(i+1, len(s)) if s[i:j+1] == "".join(reversed(s[i:j+1]))], key=lambda x: len(x)))
发布于 2019-02-27 05:09:34
您的代码存在多个问题,包括检查回文的逻辑。
语法错误:
在longestPalSubsB函数中,变量'i‘的范围从0到len(s)-1。range(n)
的范围从0到n-1
。因此,应该使用for i in range(len(s)):
语法。类似的语法也适用于j
。
假设str = "STARWARS"
,str[0:1]
返回'S'
,str[1:4]
返回"TAR“。
return s[start,end]
抛出语法错误。应该是s[start:end+1]
逻辑错误:
在isSubPalindrome
函数中,应该使用变量i
来比较最后一个字符和第一个字符,第二个最后一个字符和第二个字符等等。下面的代码应该可以做到这一点。
def isSubPalindrome (s):
isPal = True
n = len(s)
mid = int(n/2)
for i in range(mid):
if s[i] != s[n-1-i]:
isPal = False
return isPal
你不需要在longestPalSubsB
函数中第三次循环k。使用st = s[i:j+1]
、isSubPalindrome (st)
您可能希望使用交互式python shell检查语法,这可以通过在终端或cmd中键入python
来生成。python -i test.py
提供了一个交互式python shell,其中包含您的代码的变量值。Python编码快乐!!
发布于 2019-02-27 05:57:42
这是工作代码:)
def isSubPalindrome (s,start,end):
isPal = True
st = s[start:end]
mid = int(len(st)/2)
n = len(st)
for i in range (mid):
if st[i] != st[n-1-i]:
isPal = False
return isPal
def longestPalSubsB (s):
MaxLen = 0
start = 0
end = 0
for i in range (len(s)):
for j in range (i,len(s)):
st = []
Len = 0
for k in range (i,j+1):
st.append(s[k])
Len = len (st)
if Len > MaxLen and isSubPalindrome (s,i,j+1):
MaxLen = Len
start = i
end = j + 1
return s[start:end]
s = input("Enter a string: ")
print (longestPalSubsB(s))
https://stackoverflow.com/questions/54893211
复制相似问题