140. 单词拆分 II

159 阅读1分钟

题目介绍

力扣140题:leetcode-cn.com/problems/wo…

image.png

image.png

回溯

该题目最直观的方法就是使用回溯算法。

首先遍历字符串s,找到在wordDict中出现的单词,将该单词添加到路径path中,接着向下递归,继续寻找,直到遍历完字符串s,将path中的单词使用空格符号拼接起来组成一个解,之后进行回溯,继续求解其他解。

代码如下:

class Solution {
    public List<String> wordBreak(String s, List<String> wordDict) {
        //存储wordDict
        Set<String> set = new HashSet<>(wordDict);
        //存储返回结果
        List<String> ans = new ArrayList<>();
        dfs(s, ans, 0, new LinkedList<>(), set);
        return ans;
    }

    public void dfs(String s, List<String> ans, int idx, Deque<String> path, Set<String> set) {
        if (idx == s.length()) {
            //将每个单词使用空格符号分隔开,然后连接成字符串
            ans.add(String.join(" ", path));
            return;
        }
        for (int i = idx; i < s.length(); i++) {
            //截取字符串
            String str = s.substring(idx, i + 1);
            //判断截取的单词是否在wordDict中
            if (set.contains(str)) {
                //添加单词
                path.add(str);
                //向下递归
                dfs(s, ans, i + 1, path, set);
                //回溯
                path.removeLast();
            }
        }
    }
}