Python 按字典顺序排列的下一个单词
问题 有一个词是给定的。我们需要找到下一个按字典顺序出现的单词。例如,如果单词是Python 按字典顺序排列的下一个单词,python,string,algorithm,Python,String,Algorithm,问题 有一个词是给定的。我们需要找到下一个按字典顺序出现的单词。例如,如果单词是lkjihfg,那么下一个单词将是lkjihgf 这是您可以看到的Hackerrank上的一个问题。 供参考的问题: 在下面的编辑器中完成biggerisbether函数。它应该 从 给定字符串或没有答案 我的努力 我尝试的是找到word的最大索引(比如indx),这样所有字符都不会增加。然后将indx处的字符替换为前面大于indx处字符的最小字符。最后,在indx之后反转字符串 代码 def biggerIsGre
lkjihfg
,那么下一个单词将是lkjihgf
这是您可以看到的Hackerrank上的一个问题。
供参考的问题:
在下面的编辑器中完成biggerisbether函数。它应该
从
给定字符串或没有答案
我的努力
我尝试的是找到word的最大索引(比如indx
),这样所有字符都不会增加。然后将indx
处的字符替换为前面大于indx
处字符的最小字符。最后,在indx
之后反转字符串
代码
def biggerIsGreater(w):
ww = list(set(w))
indx = -1
l = [ord(ch)for ch in w]
for i in range(len(l)-1):
if l[i] < l[i+1]:
indx = i
else:
continue
if indx == -1:
return "no answer"
j = len(l) - 1
for x in range(j,indx,-1):
if l[x] > l[indx]:
l[x], l[indx] = l[indx], l[x]
break
l[indx+1 : ] = l[len(l) - 1 : indx : -1]
y = []
for z in l:
y.append(chr(z))
ans = ''.join(y)
return ans
def biggerismorer(w):
ww=列表(集合(w))
indx=-1
l=[ord(ch)代表w中的ch]
对于范围内的i(透镜(l)-1):
如果l[i]l[indx]:
l[x],l[indx]=l[indx],l[x]
打破
l[indx+1:]=l[len(l)-1:indx:-1]
y=[]
对于l中的z:
y、 附加(chr(z))
ans=''。加入(y)
返回ans
此代码的问题在于,它没有通过所有测试用例,因为它产生了错误的结果。解决方案的优点是它具有良好的时间复杂度-
O(n)
,其中n
是输入字符串的大小。这就是为什么没有任何超时错误
然而,这段代码的问题是,并不是所有的测试用例都在验证
这是因为您在下面的循环中遗漏了一个重要案例:
for x in range(j,indx,-1):
if l[x] >= l[indx]:
l[x], l[indx] = l[indx], l[x]
break
考虑一个类似5464
的案例。因此,您的indx
是2
,并且由于您的条件l[x]>=l[indx]
您将用l[0]=4
替换l[2]=4
。这样,你的下一个单词的字典顺序就不会改变,你会得到一个错误的结果546
,即使它必须是56444
因此,如果您使您的条件更加严格,而不是因为您实际上需要一个从左侧开始的更大的字符,那么解决方案将正常工作
因此,只需将条件更改为
:
for x in range(j,indx,-1):
if l[x] > l[indx]: # fix the sign here
l[x], l[indx] = l[indx], l[x]
break
我用修复程序测试了你的代码,它通过了所有测试