You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则实现LeetCode 1813. Sentence Similarity III的中间匹配?

用正则解决Sentence Similarity III问题的中间插入判断逻辑

首先明确核心需求:当较短句子small能拆分为前缀部分+后缀部分,且这两部分可分别匹配较长句子big的开头和结尾(中间允许插入任意内容)时,两个句子判定为相似。

实现思路

将small按空格拆分为单词列表,遍历所有可能的拆分点(拆分后前缀、后缀都至少含一个单词),把small拆成前缀串和后缀串,再用正则验证big是否符合^前缀串 .* 后缀串$的格式——该格式保证前缀与big开头完全匹配,后缀与big结尾完全匹配,中间的.*可匹配任意插入内容,且所有部分都用空格分隔。

具体代码实现

import re

def are_sentences_similar(sentence1: str, sentence2: str) -> bool:
    # 确定长短句子
    if len(sentence1) > len(sentence2):
        sentence1, sentence2 = sentence2, sentence1
    small = sentence1
    big = sentence2
    
    # 先处理前缀、后缀或完全匹配的情况
    if re.match(f'^{small}( .*)?$', big) or re.match(f'^(.* ){small}$', big):
        return True
    
    # 处理中间插入的情况
    small_words = small.split()
    # 遍历所有有效拆分点
    for k in range(1, len(small_words)):
        prefix = ' '.join(small_words[:k])
        suffix = ' '.join(small_words[k:])
        # 构造正则模式,确保前后缀与中间内容用空格分隔
        pattern = fr'^{prefix} .* {suffix}$'
        if re.match(pattern, big):
            return True
    
    return False

细节说明

  • 正则模式fr'^{prefix} .* {suffix}$'严格遵循题目要求:前缀和后缀必须是big中独立的单词,插入内容与前后单词用空格分隔。
  • 拆分点范围设为1到len(small_words)-1,避免重复判断前缀/后缀的情况,提升效率。
  • 开头的前缀/后缀判断优化为^{small}( .*)?$,兼容了small与big完全相等的场景(即插入空句子的情况)。

内容的提问来源于stack exchange,提问作者planetp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:52:13