【问题标题】:Next Word in Lexicographic Order字典顺序中的下一个单词
【发布时间】:2019-06-18 02:28:51
【问题描述】:

问题

有一个词。我们需要找到按字典顺序出现的下一个单词。例如,如果单词是lkjihfg,那么下一个单词就是lkjihgf

这是 Hackerrank 的一个问题,您可以看到 here。 问题供参考:

在下面的编辑器中完成更大的IsGreater 函数。它应该 从 给定字符串或没有答案。

我的努力

我尝试的是找到单词的最大索引(比如indx),这样之后所有字符都不会增加。然后将indx处的字符与大于char的最小字符交换在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

这段代码的问题在于它没有通过所有的测试用例,因为它产生了错误的结果。

【问题讨论】:

    标签: python string algorithm


    【解决方案1】:

    您的解决方案的好处是它具有良好的时间复杂度 - O(n),其中 n 是输入字符串的大小。这就是为什么您没有任何超时错误。

    此代码的问题在于,并非所有测试用例都在验证。

    之所以如此,是因为您在下面的循环中错过了一个重要案例:

    for x in range(j,indx,-1):
        if l[x] >= l[indx]:
            l[x], l[indx] = l[indx], l[x]
            break
    

    考虑像5 4 6 4 这样的情况。因此,您的indx2,并且由于您的条件l[x] &gt;= l[indx],您将用l[0] = 4 替换l[2] = 4。这样,您的字典顺序中的下一个单词不会改变,即使它必须是5 6 4 4,您也会得到错误的结果5 4 4 6

    因此,如果您使条件更严格 &gt; 而不是 &gt;= 因为您实际上需要左侧的 LARGER 字符,那么解决方案将正常工作。

    因此,只需将您的条件更改为 &gt;

    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
    

    我用修复测试了你的代码,它通过了所有测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多