创意标题匹配问题的题解|豆包MarsCode AI刷题

112 阅读2分钟

题目如下:

image.png

做题的第一步是分析问题,也就是说,在匹配字符串中扣空,用他去匹配待匹配字符串,假如匹配成功,就返回True,如果匹配失败,就返回False。那么,如何去用程序实现这一匹配过程呢。

开始的时候,我就想先遍历这个字符串,将其中用大括号的部分替换成“1”,然后用“”.join(str)使列表合并,再用“1”.split(str)使这个字符串被大括号的部分分隔成一些小部分,然后从左到右进行匹配,具体的实现方式是列表不断地pop(0),如果全部都能匹配完毕,也就是列表变为空并且匹配指针恰好走到了待匹配字符串的末尾,就返回True,假如不能,就返回False。

这样错了,因为假如["",ab]去匹配abab,因为在ab第一次遇到ab时就被吐出来 了,所以导致匹配的提前结束,而此时abab还剩下ab没有参与匹配,就会返回False,而这是误判,因为显然abab可以写成{ab}ab。

然后我就去请教大佬。

然后就发现了贪心策略。

贪心策略(Greedy Strategy)是一种算法设计思想,通常用于求解最优化问题。在应用贪心策略时,算法在每一步选择中都采取当前看起来最优的选择,即选择在当前状态下局部最优解,从而希望能够得到全局最优解。

贪心策略的基本原则

  1. 局部最优性:在每一步决策中,选择当前看起来最优的方案。
  2. 可行性:选择的方案必须满足问题的约束条件。
  3. 最优性:通过局部最优解的不断选择,最终得到的解是全局最优解。

引用贪心策略,我们遇到了一个待匹配字符串,我想要他尽量地去匹配上我们的这个匹配字符串,所以我们还是从左到右进行匹配,因为这时候右边会有更多的空间去匹配剩下的字符串。但是,只是这样不够。在匹配过程中,匹配字符串的最后一个组分一定是待匹配字符串的最后一部分,我们索性就让他先匹配掉,这样就防止了匹配字符串最后一部分提前匹配而导致误判。 粘贴上代码。 大家一起加油鸭!

def solution(n, template_, titles):
    # Please write your code here
    template_ = list(template_)
    zhen = 0 
    while zhen < len(template_):
        if template_[zhen] == "{":
            template_.pop(zhen)
            while template_[zhen] != "}":
                template_.pop(zhen)
            if template_[zhen] == "}":
                template_.pop(zhen)
            template_.insert(zhen,"1")
            zhen += 1
     
        else:
            zhen += 1
    template_ = "".join(template_)
    template = template_.split("1")
 
    ans = []
    for  i   in titles:
        temp = template[:]
        end = temp[-1]
       
      
        
        if end != i[-len(end):] and end != "":
            ans.append("False")
            continue
        temp.pop()
        
        zhen = 0
       
       
        while temp and zhen < len(i):
            slice = temp.pop(0)
          
           
            while zhen< len(i) and i[zhen:zhen +len(slice)] != slice:
                zhen += 1
            if i[zhen:zhen + len(slice)] == slice:
               
                
             
                continue
            else:
                ans.append('False')
                temp.insert(0,slice)
               
                break
            
        if not temp:
            ans.append("True")
        
    

    return ",".join(ans) 
    ```