[英]Next Word in Lexicographic Order
問題
有一句話給。 我們需要找到按字典順序出現的下一個單詞。例如,如果單詞是lkjihfg
則下一個單詞將是lkjihgf
。
這是Hackerrank 的一個問題,你可以在這里看到。 問題供參考:
在下面的編輯器中完成 bigIsGreater 函數。 它應該返回給定字符串中可能的最小的字典序較高的字符串或沒有答案。
我的努力
我嘗試過的是找到 word 的最大索引(比如indx
),以便在它之后所有字符都不會增加。然后將indx
處的 char 與前面的最小字符交換,該最小字符大於indx
char 。 最后,在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
這段代碼的問題在於它沒有通過所有的測試用例,因為它產生了錯誤的結果。
您的解決方案的好處是它具有很好的時間復雜度 - 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
這樣的情況。 因此,您的indx
是2
並且由於您的條件l[x] >= l[indx]
您將用l[0] = 4
替換l[2] = 4
l[0] = 4
。 這樣,您按字典順序排列的下一個單詞不會改變,並且您會得到錯誤的結果5 4 4 6
即使它必須是5 6 4 4
。
因此,如果您使條件更嚴格>
而不是>=
因為您實際上需要左側的更大字符,那么解決方案將正常工作。
因此,只需將您的條件更改為>
:
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
我使用修復程序測試了您的代碼,它通過了所有測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.