题目描述
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
样例
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
算法分析
- 1、将
wordDict
链表中所有的元素放进set
中,便于查询 - 2、如图所示
时间复杂度 $O(n^3)$
Java 代码
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
HashSet<String> set = new HashSet<String>();
for(String t : wordDict) set.add(t);
int n = s.length();
s = " " + s;
boolean[] f = new boolean[n + 10];
f[0] = true;
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= i;j ++)
{
String t = s.substring(j,i + 1);
if(set.contains(t)) f[i] |= f[j - 1];
}
}
return f[n];
}
}
|=这是什么意思呢?
都是false 才是false,如果只要有一个true, 返回true
contains 是o1吧
这个图用什么软件画的呀
强