LeetCode-Python-1258. 近义词句子 ( DFS)

给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换。

请你找出所有用近义词替换后的句子,按 字典序排序 后返回。

 

示例 1:

输入:
synonyms = [["happy","joy"],["sad","sorrow"],["joy","cheerful"]],
text = "I am happy today but was sad yesterday"
输出:
["I am cheerful today but was sad yesterday",
"I am cheerful today but was sorrow yesterday",
"I am happy today but was sad yesterday",
"I am happy today but was sorrow yesterday",
"I am joy today but was sad yesterday",
"I am joy today but was sorrow yesterday"]
 

提示:

0 <= synonyms.length <= 10
synonyms[i].length == 2
synonyms[0] != synonyms[1]
所有单词仅包含英文字母,且长度最多为 10 。
text 最多包含 10 个单词,且单词间用单个空格分隔开。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/synonymous-sentences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

此题难点在于怎么把所有的近义词 merge 在一起,

比如已知 joy 和 happy 是近义词, joy 和 cheerful 也是近义词,现在需要得到 [joy, happy, cheerful]。

可以先把所有的近义词利用哈希表建图,然后用dfs一层层往下找。

注意返回之前要排序。

时间复杂度:O( 2 ^ len(synonyms))

空间复杂度:O( 2 ^ len(synonyms))

class Solution(object):
    def generateSentences(self, synonyms, text):
        """
        :type synonyms: List[List[str]]
        :type text: str
        :rtype: List[str]
        """
        from collections import defaultdict
        dic = defaultdict(set)
        vocab = set()
        text = text.split()
        
        for w1, w2 in synonyms:
            dic[w1].add(w2) # 一组近义词关系就是一条边
            dic[w2].add(w1)
            vocab.add(w1)
            vocab.add(w2)

        self.res = []
        
        def generateList(word, res, visited):
            # 将word的所有近义词找出来,merge, 并返回
            res.add(word)
            for w in dic[word]:
                if w not in visited:
                    visited.add(w)
                    generateList(w, res, visited)
            
            return res

            
        def dfs(start, tmp):
            if start >= len(text):
                self.res.append(tmp)
                return
            
            word = text[start]
            if word in vocab:
                l = set()
                visited = set()
                generateList(word, l, visited)
                for w in l:
                    if start > 0:
                        dfs(start + 1, tmp + " " + w)
                    else:
                        dfs(start + 1, w)
            else:
                if start > 0:
                    dfs(start + 1, tmp + " " + word)
                else:
                    dfs(start + 1, word)        
        dfs(0, "")
        self.res.sort()
        return self.res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值