zoukankan      html  css  js  c++  java
  • 有意义的单词分割——经典dfs题目

    680. 分割字符串

    中文
    English

    给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果

    样例

    样例1

    输入: "123"
    输出: [["1","2","3"],["12","3"],["1","23"]]
    

    样例2

    输入: "12345"
    输出: [["1","23","45"],["12","3","45"],["12","34","5"],["1","2","3","45"],["1","2","34","5"],["1","23","4","5"],["12","3","4","5"],["1","2","3","4","5"]]
    
    class Solution:
        """
        @param: : a string to be split
        @return: all possible split string array
        """
        result = []
        
        def splitString(self, s):
            # write your code here
            self.split_string_helper(s, start_index=0, path=[])
            return self.result
            
        
        def split_string_helper(self, s, start_index, path):
            if start_index >= len(s):
                self.result.append(list(path))
                return
            
            for step in (1, 2):
                if start_index + step > len(s): # if no this clause, bug for "1" => ["1", "1"]
                    return
                comb = s[start_index:start_index+step]
                path.append(comb)
                self.split_string_helper(s, start_index+step, path)
                path.pop()
            
            
    

    582. 单词拆分II

    中文
    English

    给一字串s和单词的字典dict,在字串中增加空格来构建一个句子,并且所有单词都来自字典。
    返回所有有可能的句子。

    样例

    样例 1:

    输入:"lintcode",["de","ding","co","code","lint"]
    输出:["lint code", "lint co de"]
    解释:
    插入一个空格是"lint code",插入两个空格是 "lint co de"
    

    样例 2:

    输入:"a",[]
    输出:[]
    解释:字典为空
    
    import sys
    import json
    
    
    def load_data():
        data = json.loads(sys.stdin.read())
        return data["string"], set(data["word_list"])
    
    
    def dfs(s, start, words, arr, results):
        if start == len(s):
            results.append(",".join(arr))
            return
        for i in range(start, len(s)):
            word = s[start:i+1]
            if word in words:
                arr.append(word)
                dfs(s, i+1, words, arr, results)
                arr.pop()
    
    
    def main():
        string, words = load_data()
        results, arr = [], []
        start = 0
        dfs(string, start, words, arr, results)
        results.sort()
        print(json.dumps({'results': results}))
    
    
    if __name__ == "__main__":
        main()
    

    当然,如果使用cache的话,更快:

    class Solution:
        """
        @param: s: A string
        @param: wordDict: A set of words.
        @return: All possible sentences.
        """
    
        def wordBreak(self, s, wordDict):
            # write your code here
            self.cache = {}
            return [" ".join(words) for words in self.dfs(s, words_dict=wordDict)]
    
        def dfs(self, s, words_dict):
            if s in self.cache:
                return self.cache[s]
    
            if not s:
                return [[]]
    
            result = []
            for i in range(0, len(s)):
                word = s[:i + 1]
                if word in words_dict:
                    for w in self.dfs(s[i + 1:], words_dict):
                        result.append([word] + w)
    
            self.cache[s] = result
            return result
    

      

  • 相关阅读:
    hdu 2569
    hdu 2571
    hdu 4540
    Linux:远程到linux的图形界面
    Windows:文件服务器,访问进去不能查看到完整的文件
    Linux:去除认证,加速 SSH登录
    Linux:永久修改网卡的MAC地址
    Loadrunner:LR提交JSON格式的POST请求
    Linux: vi 编辑器中文乱码
    自动化测试相关:Android SDK无法下载问题,不FQ的解决办法
  • 原文地址:https://www.cnblogs.com/bonelee/p/11580576.html
Copyright © 2011-2022 走看看