首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >字符串索引超出范围(Python3)

字符串索引超出范围(Python3)
EN

Stack Overflow用户
提问于 2019-02-27 04:02:11
回答 3查看 188关注 0票数 1

我一直在第4行得到字符串索引超出范围(if si != send-i:),但是我不知道为什么。我在可视化工具上运行我的代码,但这对我没有帮助。在我输入一个字符串s之后,代码应该给我最长的回文子字符串。

下面是我的代码:

代码语言:javascript
复制
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))
代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2019-02-27 04:21:31

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

代码语言:javascript
复制
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]进行比较。显然不是你想要做的。

你可能是这个意思:

代码语言:javascript
复制
for i in range(end-start):
    if s[start+i] != s[end-i]:
        isPal = False

为了解决你的问题,有一个(长长的)一行代码来解决:

代码语言:javascript
复制
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)))
票数 1
EN

Stack Overflow用户

发布于 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来比较最后一个字符和第一个字符,第二个最后一个字符和第二个字符等等。下面的代码应该可以做到这一点。

代码语言:javascript
复制
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编码快乐!!

票数 1
EN

Stack Overflow用户

发布于 2019-02-27 05:57:42

这是工作代码:)

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54893211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档