所以我正在做MIT 6.00.1类,遇到一个问题集,在这里我必须确定随机生成的字符串中最长的字母子字符串(例如,“ abcdtttyyttt”,最长的字母子字符串将是“ abcdt”)。
我解决问题的代码如下:
s = "abzabc"
longestWord = []
subStr = []
for i in range(len(s)):
if s[i] >= s[i-1]:
subStr += s[i]
else:
subStr = s[i]
if len(subStr) > len(longestWord):
longestWord = subStr
print("Longest substring in alphabetical order is: ", "".join(longestWord))
!!!但这是我不理解的!!!
在弄清楚这一点之前,我花了几个小时在一个解决方案上,将“ s”字符串中的当前字符(我必须检查的随机生成的字符串)与下一个字符进行比较,如下所示:
if s[i] < s[i+1]
使用此解决方案,我总是最终得到“字符串索引超出范围”,因为我正在查看的字符串中字母之间的最后一个比较超出了范围,因为没有要检查的字母反对(s [i] +1部分)。
当我将s [i]与s [i] -1比较时,如何不出现“字符串索引超出范围”错误?当然,第一个字母前面没有字母,这意味着我有点“超出范围”了吗?
希望有人可以向我解释!我在其他任何地方都找不到答案。
答案 0 :(得分:1)
问题是s[i-1]
为零时i
为s[-1]
。这不会返回字符串开头之前的字符,而是返回字符串的 last 字符。这可能不是您想要的!
解决方法可能是回到使用s [i + 1],但要使用:
for i in range(len(str)-1):
它将在字符串的最后一个字符之前停止。
或者,您可以使用:
for i in range(2, len(str)):
i
将从1开始(假设至少有两个字符-您可能需要特殊情况下一个字符串)。
答案 1 :(得分:1)
您的代码可以使用,但是首先您需要分配subStr
的s [0]值。
s = "abzabd"
longestWord = ''
subStr = s[0]
for i in range(1, len(s)):
if s[i] >= s[i-1]:
subStr += s[i]
else:
subStr = s[i]
if len(subStr) > len(longestWord):
longestWord = subStr
print(longestWord)
您可以将key
kwarg设置为max()
函数和生成器函数来使用len
函数:
def get_ascending_words(s):
if not s:
return
if len(s) == 1:
yield s
return
ws, i = 0, 1
while True:
if ws >= len(s):
break
while i < len(s) and s[i] > s[i-1]:
i += 1
yield s[ws:i]
ws = i
i += 1
s = "abzabcd"
print(list(get_ascending_words(s)))
print(max(*get_ascending_words(s), key=len))