面试题 16.18. 模式匹配
Medium
思路
- 从示例开始分析,
a的可能性是从空字符串到整个value字符串。同样b也是 - 以示例1为例,
pattern[0]为a,我们先列出a的可能性 - 当
a确定了之后,我们再看pattern[1],pattern[1]为b b没有确定过,所以b的可能性是从上一个确定的字符串剩下的开始到整个value- 下一个
pattern[2]还是b,b已经确定过了,我们用b匹配剩下的内容。发现不一样,说明b的值确定的不正确,需要重新确认 - 指导整个
pattern都与value都匹配完成
显然使用递归来求解
- 确定了
a或b对应的子串之后,将剩下的pattern和value,抛给下一层递归 - 递归终止条件,
pattern和value都为空,表示匹配完成;确定了的子串,和剩下的value不匹配,终止,返回上层重新选择 - 有个变量要存放匹配过的
a或b的子串 a和b对应的子串应该不相同
尝试写一下代码,AC!
代码
python3
class Solution:
def helper(self, pattern, value, match):
if pattern == '' and value != '':
return False
if pattern == '' and value == '' :
return True
p = pattern[0]
if match[p] != None:
if value.startswith(match[p]):
return self.helper(pattern[1:], value.replace(match[p], '', 1), match)
else:
return False
for m in range(len(value) + 1):
w = value[0:m]
if match['a'] == w or match['b'] == w: #a或b已经匹配到了
continue
match[p] = w
if (self.helper(pattern[1:], value.replace(match[p], '', 1), match)):
return True
match[p] = None
return False
def patternMatching(self, pattern: str, value: str) -> bool:
return self.helper(pattern, value, {'a':None, 'b':None})