【发布时间】:2017-01-21 13:14:12
【问题描述】:
问题
给定一个单词,通过交换部分或全部来创建一个新单词 人物。这个新词必须满足两个条件:
它必须大于原始单词它必须是最小的单词。
必须是满足第一个条件的最小单词
请查看完整问题here
我的努力
我正在尝试解决这个挑战,但不想使用排列。
以下代码适用于一小部分测试数据,但无法通过100000 案例。谁能帮忙提供一些建议来优化下面的代码:
t=int(raw_input())
for _ in range(t):
s=list(raw_input().strip())#change to list
pos = -1#check pos, if pos is bigger, it's smallest bigger lexilogical, so only choose big pos
i_temp=0
for i in reversed(range(len(s))):
for j in reversed(range(i)):
if s[i]>s[j]: #last letter is bigger than previous, in this case , we can swap to previous one, and found bigger one.
if j>pos:
pos=j#new place
i_temp=i
break
if j<pos:
break #already found good one
if i<pos:
break #already found good one
if pos>=0:
s_tmp=s[pos]
s[pos]=s[i_temp]
s[i_temp]=s_tmp
s1 = s[pos+1:] #get string for smallest
s1.sort()
print ("".join(s[:pos+1]+s1))
else:
print ("no answer")
【问题讨论】:
-
欢迎来到 StackOverflow。请考虑将此问题移至 Stack Exchange 的 Code Review 网站,因为您的代码确实有效,并且只需要优化。参考:Can I post questions about optimizing code on Stack Overflow?
-
好吧,想想看。如何移动
w中的字符以获得更大的字典字符串s?根据定义,如果w < s则为w[0] < s[0]或w[0] == s[0] and w[1:] < s[1:]。你怎么能确定w[0] < s[0]?好吧:如果s[0]是字符串中最大的字符,那么你肯定会得到那个比较,或者至少得到w[0] == s[0]并递归地继续......继续这个推理,最后你会发现答案是''.join(sorted(text, reversed=True)) -
快速思考:这个问题可以用分而治之的范式来解决吗?
标签: python algorithm optimization