首页 > 试题广场 >

单词拆分(二)

[编程题]单词拆分(二)
  • 热度指数:1358 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串 s 和一个字符串数组 dic ,在字符串 s 的任意位置添加任意多个空格后得到的字符串集合是给定字符串数组 dic 的子集(即拆分后的字符串集合中的所有字符串都在 dic 数组中),你可以以任意顺序 返回所有这些可能的拆分方案

数据范围:字符串长度满足 ,数组长度满足 ,数组中字符串长度满足
示例1

输入

"nowcoder",["now","coder","no","wcoder"]

输出

["no wcoder","now coder"]
示例2

输入

"nowcoder",["now","wcoder"]

输出

[]
示例3

输入

"nowcoder",["nowcoder"]

输出

["nowcoder"]
示例4

输入

"nownowcoder",["now","coder"]

输出

["now now coder"]

说明

你可以重复使用 dic 数组中的字符串  
Java深搜
private void dfs(String s, int index, String[] dic, ArrayList<ArrayList<String>> arrayLists, ArrayList<String> list) {
        if (index == s.length()) {
            arrayLists.add(new ArrayList<>(list));
        } else {
            for (String s1 : dic) {
                if (s.substring(index).startsWith(s1)) {
                    list.add(s1);
                    dfs(s, index + s1.length(), dic, arrayLists, list);
                    list.remove(list.size() - 1);
                }
            }
        }
    }

    public String[] wordDiv(String s, String[] dic) {
        ArrayList<ArrayList<String>> arrayLists = new ArrayList<>();
        ArrayList<String> list = new ArrayList<>();
        HashSet<String> set = new HashSet<>();
        int index = 0;
        dfs(s, 0, dic, arrayLists, list);
        for (ArrayList<String> arrayList : arrayLists) {
            StringBuilder sb = new StringBuilder();
            arrayList.stream().forEach(str -> sb.append(str + " "));
            sb.deleteCharAt(sb.length() - 1);
            set.add(sb.toString());
        }
        String[] strings = new String[set.size()];
        for (String s1 : set) {
            strings[index++] = s1;
        }
        return strings;
    }


发表于 2022-11-21 10:01:09 回复(0)
为什么java怎么提交都会报Main.java:28: error: incompatible types: ArrayList cannot be converted to String[]
发表于 2022-09-28 11:00:47 回复(0)
class Solution:
    def wordDiv(self , s: str, dic: List[str]) -> List[str]:
        # write code here
        res = []
        path = []
        index = 0
        
        def backtrack(index):
            if index >= len(s):
                res.append(' '.join(path[:]))
                return 
            for i in range(index, len(s)):
                p = s[index : i + 1]
                if p in dic:
                    path.append(p)
                else:
                    continue 
                backtrack(i + 1)
                path.pop()
        
        backtrack(index)
        return res

发表于 2022-08-15 05:35:01 回复(0)
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @param dic string字符串一维数组
# @return string字符串一维数组
#
class Solution:
    """
    题目:
        NC182 单词拆分(二)
        https://www.nowcoder.com/practice/bb40e0aae84a4491a35f93b322516cb5?tpId=117&&tqId=39349&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
        https://leetcode-cn.com/problems/word-break-ii/
    算法:
        记忆化搜索 回溯
        对于字符串s,如果某个前缀是单词表中的单词,然后对s剩余部分继续拆分。如果可以将整个字符串s拆分成单词列表中的单词,则可以得到1个句子。在对s的剩余部分拆分得到1个句子之后,将拆分出的第1个单词(即s的前缀)添加到句子的头部,即可得到1个完成的句子。上述过程可以通过回溯实现。
        使用哈希表存储字符串s的每个下标和该下标开始的部分可以组成的句子列表,在回溯过程中,如果遇到已经访问过的下标,则可以直接从哈希表得到结果,而不需要重复计算。如果到某个下标发现无法匹配,则哈希表中该下标对应的是空列表,因此可以对不能拆分的情况进行剪枝。
    复杂度:
        时间复杂度:O(n * 2^n)
        空间复杂度:O(n * 2^n)
    """

    def wordDiv(self, s, dic):
        # write code here
        def dfs(i):
            if i == n:
                return [[]]

            ans = []
            for j in range(i + 1, n + 1):
                word = s[i:j]
                if word in wordSet:
                    nextWordDivs = dfs(j)
                    for nextWordDiv in nextWordDivs:
                        ans.append(nextWordDiv[:] + [word])
            return ans

        n = len(s)
        wordSet = set(dic)
        divList = dfs(0)

        return [' '.join(words[::-1]) for words in divList]


if __name__ == '__main__':
    s = Solution()

    str, dic = "nowcoder", ["now", "coder", "no", "wcoder"]

    # str, dic = "nowcoder", ["now", "wcoder"]

    # str, dic = "nowcoder", ["nowcoder"]

    # str, dic = "aaaaaaaaaaaaaaaaaaaa", ["a", "aa", "aaa", "aaaa", "aaaaa",
    #                                     "aaaaaa", "aaaaaaa", "aaaaaaaa",
    #                                     "aaaaaaaaa", "aaaaaaaaaa"]

    res = s.wordDiv(str, dic)

    print res

发表于 2022-07-07 10:12:05 回复(0)
static Set<String> list=new HashSet<>();
    
    public String[] wordDiv (String s, String[] dic) {
        StringBuilder st=new StringBuilder();
        findWord(st,s,dic);
        String[] sa=new String[list.size()];
        list.toArray(sa);
        return sa;
    }
    
    void findWord(StringBuilder ss, String sc, String[] dic){
        if(sc.length()==0){
            ss.delete(ss.length()-1,ss.length());
            list.add(ss.toString());
            ss.append(" ");
            return;
        }
        for(int i=0;i<dic.length;i++){
            if(dic[i].length()<=sc.length()&&sc.substring(0,dic[i].length()).equals(dic[i]))
            {
                ss.append(dic[i]+" ");
                findWord(ss,sc.substring(dic[i].length()),dic);
                ss.delete(ss.length()-dic[i].length()-1,ss.length());
            }
        }
    }

发表于 2022-05-31 19:28:21 回复(0)
深度优先搜索,简洁易懂
    HashSet<String> set;
    List<String> ret;

    public String[] wordDiv(String s, String[] dic) {
        set = new HashSet<>();
        for (String s1 : dic) {
            set.add(s1);
        }
        ret = new ArrayList<>();
        for (int i = 0; i <= s.length(); i++) {
            if (set.contains(s.substring(0, i))) {
                dfs(s, i, s.substring(0, i));
            }
        }
        return ret.toArray(new String[0]);
    }

    private void dfs(String s, int index, String ans) {
        // 递归出口
        if (s.length() == index) {
            ret.add(ans);
            return;
        }
        for (int i = index; i <= s.length(); i++) {
            if (set.contains(s.substring(index, i))) {
                dfs(s, i, ans + " " + s.substring(index, i));
            }
        }
    }




编辑于 2022-02-12 20:00:15 回复(0)

问题信息

难度:
6条回答 3225浏览

热门推荐

通过挑战的用户

查看代码