[LeetCode] 面试题 16.18. 模式匹配

292 阅读1分钟

面试题 16.18. 模式匹配

Medium

思路

  • 从示例开始分析,a的可能性是从空字符串到整个value字符串。同样b也是
  • 以示例1为例,pattern[0]a,我们先列出a的可能性
  • a确定了之后,我们再看pattern[1]pattern[1]b
  • b没有确定过,所以b的可能性是从上一个确定的字符串剩下的开始到整个value
  • 下一个pattern[2]还是bb已经确定过了,我们用b匹配剩下的内容。发现不一样,说明b的值确定的不正确,需要重新确认
  • 指导整个pattern都与value都匹配完成

显然使用递归来求解

  • 确定了ab对应的子串之后,将剩下的patternvalue,抛给下一层递归
  • 递归终止条件,patternvalue 都为空,表示匹配完成;确定了的子串,和剩下的value不匹配,终止,返回上层重新选择
  • 有个变量要存放匹配过的ab的子串
  • ab对应的子串应该不相同

尝试写一下代码,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})