给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
题解:
1.一个非空字符串和一个包含非空单词列表的字典
2.字符串能否被空格拆分成单词
3.这些单词必须是单词表里的
4.字典中的词可以重复用,也没有重复单词
示例 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
解题思路:
迭代是从底向上,递归先从顶向底,在从底向顶返回值
递归中这里底即是字符串为空(前0个字符),设在字典中
对字符串不断从字典中匹配头部,能匹配上就去掉该头部
递归匹配剩余字符串,直到字符串被截取剩空,则说明能被字典中单词组成,返回true
C/C++题解:
class Solution {
public:
bool wordBreak(string s, vector
if (s.length() == 0) return true;//初始0,假设字符串为空为包含在字典内
if (s.length() >= 151) return false;//限制一下最大长度
for (int i = 0; i < wordDict.size(); i++) {
string word = wordDict[i];//取字典里的单词
if (s.find(word) == 0) {//与字符串头匹配
//匹配上则有单词,从字符串中去掉该单词递归检查去字符串
//如果字符串最后截取为空字符,则组词全在字典内
int j = word.size();
int k = s.size();
if (wordBreak(s.substr(j,k), wordDict))
return true;} }//最上层返回true
return false;}};//否则不能
Debug结果:
Java题解:
class Solution {
public boolean wordBreak(String s, List
if (s.length() == 0) return true;//初始0,假设字符串为空为包含在字典内
if (s.length() >= 151) return false;//限制一下最大长度
for (int i = 0; i < wordDict.size(); i++) {
String word = wordDict.get(i);//取字典里的单词
if (s.startsWith(word)) {//与字符串头匹配
//匹配上则有单词,从字符串中去掉该单词递归检查去字符串
//如果字符串最后截取为空字符,则组词全在字典内
if (wordBreak(s.substring(word.length()), wordDict))
return true;}}//最上层返回true
return false;}}//否则不能
Debug结果:
Python题解:
class Solution(object):
def wordBreak(self, s, wordDict):
""":type s: str:type wordDict: List[str]
:rtype: bool"""
if len(s) == 0: return True #初始0,假设字符串为空为包含在字典内
if len(s) >= 151: return False #限制一下最大长度
for i in range(len(wordDict)):
word = wordDict[i] #取字典里的单词
if s.startswith(word): #与字符串头匹配
#匹配上则有单词,从字符串中去掉该单词递归检查去字符串
#如果字符串最后截取为空字符,则组词全在字典内
if Solution.wordBreak(self, s[len(word):], wordDict)==True:
return True #最上层返回true
return False #否则不能
Debug结果:
更多题解移步公众号: