我有一些像'hefg','dhck','dkhc','lmno'
这样的词(字符串),它们可以通过交换一些或所有的字符来转换成新词,这样新词在词典中比原来的词大,而且新词是所有比原来的词大的词中最小的。
例如'dhck'
应该输出'dhkc'
,而不是'kdhc'
、'dchk'
或任何其他。你知道吗
我有这些信息
hefg
dhck
dkhc
fedcbabcd
哪个应该输出
hegf
dhkc
hcdk
fedcbabdc
我试过用python编写这段代码,除了'dkhc'
和'fedcbabcd'
之外,它对所有人都有效。
我已经发现'fedcbabcd'
的第一个字符是最大值,所以它不是交换了。和
我得到"ValueError: min() arg is an empty sequence"
如何修改算法来修复这些情况?你知道吗
list1=['d','k','h','c']
list2=[]
maxVal=list1.index(max(list1))
for i in range(maxVal):
temp=list1[maxVal]
list1[maxVal]=list1[i-1]
list1[i-1]=temp
list2.append(''.join(list1))
print(min(list2))
在一般情况下,最大字符及其位置对算法没有影响。例如,对于
'fedcbabcd'
,您可以在字符串的开头预先加上a
或z
,这样就不会改变您需要交换最后两个字母的事实。你知道吗考虑输入
'dgfecba'
。这里,输出是'eabcdfg'
。为什么?请注意,最后六个字母是按降序排序的,因此通过更改其中的任何内容,可以按字典顺序得到一个较小的字符串,这是不好的。因此,您需要替换初始的'd'
。我们应该用什么来代替它?我们想要比'd'
大的东西,但要尽可能小,所以'e'
。剩下的六个字母呢?同样,我们需要一个尽可能小的字符串,所以我们按字典顺序对字母排序:'eabcdfg'
。你知道吗所以算法是:
i
为最右边的位置,其中s[i] < s[i + 1]
;在我们的例子中,i
=0i
-1上的符号不变i+1 ... n-1
中找到包含大于s[i]
的最小符号的位置;将此位置称为j
;在本例中,j
=3s[i]
和s[j]
;在我们的例子中,我们得到'egfdcba'
s[i+1] ... s[n-1]
;在本例中,我们得到'eabcdfg'
。你知道吗你的问题可以改写成finding the next lexicographical permutation of a string。你知道吗
上述链路中的算法描述如下:
上述算法特别有趣,因为它是O(n)。你知道吗
代码
如果单词已经是最后一个词典排列,上述算法将引发
StopIteration
异常。你知道吗示例
输出
您可以尝试以下方法:
示例代码:
结果:
相关问题 更多 >
编程相关推荐