如何用正则实现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
相关产品推荐
相关产品推荐

