Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按字典顺序排列的下一个单词_Python_String_Algorithm - Fatal编程技术网

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
我用修复程序测试了你的代码,它通过了所有测试