/**
* 140. 单词拆分 II
* @author wsq
* @date 2020/11/1
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
输出:
[
"cats and dog",
"cat sand dog"
]
示例 2:
输入:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
输出:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
解释: 注意你可以重复使用字典中的单词。
链接:https://leetcode-cn.com/problems/word-break-ii
*/
package com.wsq.huishuo;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class WordBreak {
/**
* 回溯法,没想到,被困难的标识吓到了。。。
* @param s
* @param wordDict
* @return
*/
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> ans = new LinkedList();
Map<Integer, List<List<String>>> map = new HashMap();
List<List<String>> breakList = backTrack(s, s.length(), new HashSet<String>(wordDict), 0, map);
for(List<String> list: breakList){
ans.add(String.join(" ", list));
}
return ans;
}
/**
* 采用回溯的方法分割字符串
* @param s
* @param length
* @param wordSet
* @param index
* @param map 用于报保存用 已访问起始点 分割的字符串的情况, 使用空间换取时间
* @return
*/
private List<List<String>> backTrack(String s, int length, Set<String> wordSet, int index, Map<Integer, List<List<String>>> map){
if(!map.containsKey(index)){
List<List<String>> wordBreaks = new LinkedList();
if(index == length){
wordBreaks.add(new LinkedList());
}
for(int i = index + 1; i <= length; i++){
String word = s.substring(index, i);
if(wordSet.contains(word)){
List<List<String>> subBeaks = backTrack(s, length, wordSet, i, map);
for(List<String> list: subBeaks){
LinkedList<String> wordBreak = new LinkedList<String>(list);
wordBreak.offerFirst(word);
wordBreaks.add(wordBreak);
}
}
}
map.put(index, wordBreaks);
}
return map.get(index);
}
}
140. 单词拆分 II(回溯法)
最新推荐文章于 2023-05-03 10:55:37 发布