我正在编写一个类的代码,希望我使用嵌套循环来创建一个代码来检查字符串中的子字符串。
基本上我的老师想要证明函数'在'中,如:
ana in banana
将返回True。
该计划的目标是制作2个参数的函数,
substring(subStr,fullStr)
将打印出一句话,说如果subStr是fullStr的子字符串,我的程序如下:
def substring(subStr,fullStr):
tracker=""
for i in (0,(len(fullStr)-1)):
for j in (0,(len(subStr)-1)):
if fullStr[i]==subStr[j]:
tracker=tracker+subStr[j]
i+=1
if i==(len(fullStr)-1):
break
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
当我在解释器' substring(" ana"," banana")'中调用该函数时,它在第5行打印出一个回溯错误字符串索引超出范围:
if fullStr[i]==subStr[j]:
我试图找到错误。任何帮助将不胜感激
答案 0 :(得分:0)
有几个单独的问题。
tracker
。这意味着前一次迭代的剩余物会污染后来的迭代。range
,而是循环遍历tuple
0
以及每个字符串的长度。以下是更正后的版本。
def substring(subStr,fullStr):
for i in range(0,(len(fullStr))):
tracker=""
for j in range(0,(len(subStr))):
if i + j >= len(fullStr):
break
if fullStr[i+j]==subStr[j]:
tracker=tracker+subStr[j]
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
return
substring("ana", "banana")
答案 1 :(得分:0)
首先,你的循环应该是
for i in xrange(0,(len(fullStr))):
例如,。我在(0,len(fullStr)-1)中我将第一次接受值0,然后第二次接受len(fullStr)-1。我假设您的算法也希望它能够采用中间值。
现在,就错误而言,在for循环的最后一次传递中考虑i
。 i
将等于len(fullStr)-1
。现在,当我们执行i+=1
时,i
现在等于len(fullStr)
。这并没有满足i==len(fullStr)-1
的条件,所以我们不会破坏,我们循环,然后崩溃。如果你在if i>=len(fullStr)-1
声明之前做出i==len(fullStr)-1
或检查if fullStr[i]==subStr[j]:
,那会更好。
最后,虽然与具体问题无关,但每次停止查看某个匹配项时都不会重置tracker
。您应该在tracker = ""
行之后放置for i in xrange(0,(len(fullStr))):
。从i
开始循环遍历列表后,您也不会检查跟踪器是否正确,当您遇到不匹配时也不会从循环中断(而是继续并可能拾取更多匹配但不连续的字母。 )
以下是完全更正的版本:
def substring(subStr,fullStr):
for i in xrange(0,(len(fullStr))):
tracker="" #this is going to contain the consecutive matches we find
for j in xrange(0,(len(subStr))):
if i==(len(fullStr)): #end of i; no match.
break
if fullStr[i]==subStr[j]: #okay, looks promising, check the next letter to see if it is a match,
tracker=tracker+subStr[j]
i+=1
else: #found a mismatch, leave inner loop and check what we have so far.
break
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
return #we already know it is a substring, so we don't need to check the rest