leetcode-面试题 16.18. 模式匹配
Posted oldby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-面试题 16.18. 模式匹配相关的知识,希望对你有一定的参考价值。
方法一:
class Solution: def patternMatching(self, pattern: str, value: str) -> bool: count_a = sum(1 for ch in pattern if ch == ‘a‘) count_b = len(pattern) - count_a if count_a < count_b: count_a, count_b = count_b, count_a pattern = ‘‘.join(‘a‘ if ch == ‘b‘ else ‘b‘ for ch in pattern) if not value: return count_b == 0 if not pattern: return False for len_a in range(len(value) // count_a + 1): rest = len(value) - count_a * len_a if (count_b == 0 and rest == 0) or (count_b != 0 and rest % count_b == 0): len_b = 0 if count_b == 0 else rest // count_b pos, correct = 0, True value_a, value_b = None, None for ch in pattern: if ch == ‘a‘: sub = value[pos:pos+len_a] if not value_a: value_a = sub elif value_a != sub: correct = False break pos += len_a else: sub = value[pos:pos+len_b] if not value_b: value_b = sub elif value_b != sub: correct = False break pos += len_b if correct and value_a != value_b: return True return False
方法二:正则
class Solution: def patternMatching(self, pattern: str, value: str) -> bool: # 边界情况处理 if not pattern: return not value if len(pattern) == 1: return True # 构造正则表达式:重点是正则表达式的“后向引用” rega, regb = (‘\\1‘, ‘\\2‘) if pattern[0] == ‘a‘ else (‘\\2‘, ‘\\1‘) p = pattern.replace(‘a‘, ‘(\\w*)‘, 1).replace(‘b‘, ‘(\\w*)‘, 1).replace(‘a‘, rega).replace(‘b‘, regb) p = ‘^‘ + p + ‘$‘ m = re.match(p, value) # 匹配到 && (模式长度为1 || 模式长度为2 && 两个模式不相同) return bool(m and (len(m.groups()) == 1 or m.groups()[0] != m.groups()[1])) 作者:dz-lee 链接:https://leetcode-cn.com/problems/pattern-matching-lcci/solution/7xing-dai-ma-zheng-ze-biao-da-shi-jie-fa-python3xi/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于leetcode-面试题 16.18. 模式匹配的主要内容,如果未能解决你的问题,请参考以下文章