单词拆分
一、题目
139. 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
提示:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 仅由小写英文字母组成
wordDict 中的所有字符串 互不相同
二、题解
我是彩笔,完全不会写
题解一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { private boolean[] cache; public boolean wordBreak(String s, List<String> wordDict) { cache = new boolean[s.length()]; return tryMatch(s, 0, wordDict); }
private boolean tryMatch(String src, int start, List<String> wordDict){ if(cache[start]){ return false; } for(int i = 0; i < wordDict.size(); i++){ if(isMatch(src, start, wordDict.get(i))){ cache[start] = true; int nextStart = start + wordDict.get(i).length(); if(nextStart == src.length()){ return true; }else{ boolean result = tryMatch(src, nextStart, wordDict); if(result){ return true; } } } } cache[start] = true; return false; }
private boolean isMatch(String src, int start, String word){ if(word.length() > src.length() - start){ return false; } for(int i = start; i < src.length() && i - start < word.length(); i++){ if(src.charAt(i) != word.charAt(i - start)){ return false; } } return true; } }
|
题解二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public static boolean wordBreak(String s, List<String> wordDict) { int n = s.length(); boolean[] dp = new boolean[n + 1]; dp[0] = true; Set<String> set = new HashSet<>(wordDict); for (int i = 1; i <= n; ++i) { for (int j = 0; j < i; ++j) { if (dp[j] && set.contains(s.substring(j, i))) { dp[i] = true; break; } else dp[i] = false; } } return dp[n]; }
|
三、总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| import java.util.HashSet; import java.util.List; import java.util.Set;
public class WordBreak {
public static void main(String[] args) { String s = "cars"; List<String> wordDict = List.of("car", "ca", "rs"); System.out.println(wordBreak2(s, wordDict)); WordBreak wordBreak = new WordBreak(); System.out.println(wordBreak.wordBreak(s, wordDict)); }
public static boolean wordBreak2(String s, List<String> wordDict) { int n = s.length(); boolean[] dp = new boolean[n + 1]; dp[0] = true; Set<String> set = new HashSet<>(wordDict); for (int i = 1; i <= n; ++i) { for (int j = 0; j < i; ++j) { if (dp[j] && set.contains(s.substring(j, i))) { dp[i] = true; break; } else dp[i] = false; } } return dp[n]; }
private boolean[] cache; public boolean wordBreak(String s, List<String> wordDict) { cache = new boolean[s.length()]; return tryMatch(s, 0, wordDict); }
private boolean tryMatch(String src, int start, List<String> wordDict){ if(cache[start]){ return false; } for(int i = 0; i < wordDict.size(); i++){ if(isMatch(src, start, wordDict.get(i))){ cache[start] = true; int nextStart = start + wordDict.get(i).length(); if(nextStart == src.length()){ return true; }else{ boolean result = tryMatch(src, nextStart, wordDict); if(result){ return true; } } } } cache[start] = true; return false; }
private boolean isMatch(String src, int start, String word){ if(word.length() > src.length() - start){ return false; } for(int i = start; i < src.length() && i - start < word.length(); i++){ if(src.charAt(i) != word.charAt(i - start)){ return false; } } return true; } }
|