【问题标题】:Bigger is Greater Problem - how to optimise the solutionBigger is Greater Problem - 如何优化解决方案
【发布时间】: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 &lt; s 则为w[0] &lt; s[0]w[0] == s[0] and w[1:] &lt; s[1:]。你怎么能确定w[0] &lt; s[0]?好吧:如果s[0] 是字符串中最大的字符,那么你肯定会得到那个比较,或者至少得到w[0] == s[0] 并递归地继续......继续这个推理,最后你会发现答案是''.join(sorted(text, reversed=True))
  • 快速思考:这个问题可以用分而治之的范式来解决吗?

标签: python algorithm optimization


【解决方案1】:

你的直觉是对的,所以我会尽力提供帮助。

步骤 1:你正在反向迭代寻找 a[i]

让自己轻松一点:先找到解点,然后计算输出。不要尝试在第 1 步中跟踪第 2 步所需的变量。第 2 步只会被每个字符串调用一次:

def f(w):
    best = ''
    for i in range(len(w)):
        idx = -i-1
        c = w[idx]
        if c >= best:
            best = c
        else:
            l = sorted(w[idx:])
            for j, ch in enumerate(l):
                if ch > c:
                    return w[:idx] + ch + ''.join(l[:j] + l[j+1:])
    return 'no answer'

n = input()
for i in range(n):
    print f(raw_input())

【讨论】:

    【解决方案2】:

    我的简单语言解决方案:PYTHON 3

    从相反的顺序检查单词,如果发现大于前一个的单词,则将该单词分成 2 部分。之后对第二部分进行排序,如果找到更大的单词,则将第一部分的最后一个单词与第二部分进行比较。 最后加入这两个部分。

    s="fedcbabcd"
    s=list(s)
    if (sorted(s,reverse=True))==s:
        print("no answer")
    else:
        for i in range(len(s) - 1, 0, -1):
            if s[i] > s[i - 1]:
                lft = s[:i]
                rgt = s[i:]
                break
    
        rgt =(sorted(rgt))
    
        for i in range(len(rgt)):
            if lft[len(lft) - 1] < rgt[i]:
                t = lft[len(lft) - 1]
                lft[len(lft) - 1] = rgt[i]
                rgt[i] = t
                break
    
    
        print(''.join(lft+rgt))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 2020-11-19
      • 2016-02-18
      • 1970-01-01
      相关资源
      最近更新 更多