LeetCode 1813. 句子相似性 III

题目

LeetCode 1813. 句子相似性 III_第1张图片

思路

 这道题思路不难想,但是代码实现细节较多。我在做这道题时首先想的是区分长短句,如果短句中包含长句中没有的单词,则结果一定是false(因为短句只能通过增加句子补充到长句,但是不能删除句子)。之后因为题目要求只能在短句中插入一个句子使其变成长句,换句话说长句中出现的短句中没有的单词必须全部是相邻的,否则至少要插入两个以上的句子才可以。因此这里可以遍历长句,同时设定辅助变量并初始化为0,辅助变量用来遍历短句。如果当前遍历时出现了短句中没有的单词,则说明出现了断点,统计断点个数。当断点数量大于等于2时说明结果为false。特别地,如果短句被成功遍历完但长句还没遍历完,则这时只需判断之前是否出现过断点,如果未出现过则直接返回true,否则之后的断点数一定大于等于2,返回false。

代码

class Solution:
    def areSentencesSimilar(self, sentence1: str, sentence2: str) -> bool:
        if sentence1==sentence2:
            return True
        list1=sentence1.split()
        list2=sentence2.split()
        if len(list1)==len(list2):
            return False
        if len(list2)>len(list1):
            list1,list2=copy.deepcopy(list2),copy.deepcopy(list1)
        #print(list1,list2)
        if len(list1)>len(list2):
            s=0
            flag=1
            count=1
            vis={}
            for i in range(len(list1)):
                vis[list1[i]]=i
            for temp in list2:            #判断短句中是否出现了长句中没有的单词
                if vis.get(temp)==None:
                    return False
            for i in range(len(list1)):
                if count<0:
                    return False
                if s==len(list2):          #处理短句已遍历完但长句还没有遍历完的情况
                    if count==0:
                        return False
                    else:
                        return True
                if list1[i]==list2[s]:
                    if not flag:
                        flag=1
                    s+=1
                else:
                    if flag:
                        flag=0
                        count-=1
                
            return True

 

你可能感兴趣的:(leetcode,算法,python)