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. 模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

面试题16.18.模式匹配

LeetCode面试刷题技巧- 字符串匹配习题集

面试题19:正则表达式匹配(C++)

LeetCode面试题19. 正则表达式匹配

LeetCode面试题19. 正则表达式匹配

外观模式+LeetCode.面试题 16.11