LeetCode 140 Word Break II (DFS 分词方法 推荐)

66 篇文章 0 订阅
60 篇文章 0 订阅

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog", "cat sand dog"].

Subscribe to see which companies asked this question


题目链接:https://leetcode.com/problems/word-break-ii/

题目分析:用一个dp数组存储待分词字符串中以第i个字符结尾的所有可能单词的集合,比如dp[3] = {"cat"},dp[7] = {"and", "sand"}。。。然后DFS时枚举即可

public class Solution {
    
    void DFS(int pos, List<String>[] dp, List<String> ans, List<String> tmp) {
        if (pos == 0) {
            StringBuilder save = new StringBuilder();
            save.append(tmp.get(tmp.size() - 1));
            for (int i = tmp.size() - 2; i >= 0; i --) {
                save.append(" ");
                save.append(tmp.get(i));
            }
            ans.add(save.toString());
            return;
        }
        for (String word: dp[pos]) {
            tmp.add(word);
            DFS(pos - word.length(), dp, ans, tmp);
            tmp.remove(tmp.size() - 1);
        }
    }
    
    public List<String> wordBreak(String s, Set<String> wordDict) {
        List<String> ans = new ArrayList<>();
        int len = s.length();
        List<String>[] dp = new ArrayList[len + 1];
        dp[0] = new ArrayList<>();
        for (int st = 0; st < len; st ++) {
            if (dp[st] != null) {
                for (String word: wordDict) {
                    int ed = st + word.length();
                    if (ed <= len) {
                        if (s.substring(st, ed).equals(word) == true) {
                            if (dp[ed] == null) {
                                dp[ed] = new ArrayList<>();
                            }
                            dp[ed].add(word);
                        }
                    }
                }
            }
        }
        if (dp[len] == null) {
            return ans;
        }
        List<String> tmp = new ArrayList<>();
        DFS(len, dp, ans, tmp);
        return ans;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值