题目如下:
做题的第一步是分析问题,也就是说,在匹配字符串中扣空,用他去匹配待匹配字符串,假如匹配成功,就返回True,如果匹配失败,就返回False。那么,如何去用程序实现这一匹配过程呢。
开始的时候,我就想先遍历这个字符串,将其中用大括号的部分替换成“1”,然后用“”.join(str)使列表合并,再用“1”.split(str)使这个字符串被大括号的部分分隔成一些小部分,然后从左到右进行匹配,具体的实现方式是列表不断地pop(0),如果全部都能匹配完毕,也就是列表变为空并且匹配指针恰好走到了待匹配字符串的末尾,就返回True,假如不能,就返回False。
这样错了,因为假如["",ab]去匹配abab,因为在ab第一次遇到ab时就被吐出来 了,所以导致匹配的提前结束,而此时abab还剩下ab没有参与匹配,就会返回False,而这是误判,因为显然abab可以写成{ab}ab。
然后我就去请教大佬。
然后就发现了贪心策略。
贪心策略(Greedy Strategy)是一种算法设计思想,通常用于求解最优化问题。在应用贪心策略时,算法在每一步选择中都采取当前看起来最优的选择,即选择在当前状态下局部最优解,从而希望能够得到全局最优解。
贪心策略的基本原则
- 局部最优性:在每一步决策中,选择当前看起来最优的方案。
- 可行性:选择的方案必须满足问题的约束条件。
- 最优性:通过局部最优解的不断选择,最终得到的解是全局最优解。
引用贪心策略,我们遇到了一个待匹配字符串,我想要他尽量地去匹配上我们的这个匹配字符串,所以我们还是从左到右进行匹配,因为这时候右边会有更多的空间去匹配剩下的字符串。但是,只是这样不够。在匹配过程中,匹配字符串的最后一个组分一定是待匹配字符串的最后一部分,我们索性就让他先匹配掉,这样就防止了匹配字符串最后一部分提前匹配而导致误判。 粘贴上代码。 大家一起加油鸭!
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)
```