首页 > 解决方案 > 字符串索引超出范围(Python3)

问题描述

我不断在第 4 行获取字符串索引超出范围(如果 s[i] != s[end-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

标签: python

解决方案


Python给你一个从到包含range(start, end)的数字序列。例如,是 10、11、12、13。现在考虑这个循环:startend-1range(10, 14)

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)))

推荐阅读