给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 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
package com.ep.rabbitmq.test;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
class Solution {
public static boolean wordBreak(String s, List<String> wordDict) {
boolean dict=false;
boolean[] flag = new boolean[s.length() + 1];
//如果为空字符串则为true
flag[0] = true;
String temp;
/**
* 1.首先从前往后遍历求出满足s字符串分隔下来的字符串属于字典,将对应的辅助数组对应的变量设置为
* true,表示如果s字符串只有对应的长度,则表示满足字典要求。
* 2.然后通过循环查找,满足辅助数组flag[i]为true,则遍历begin=i,end=length的字符串,如果满足字典要求,
* 则表示对应长度的字符串满足字典要求。
* 注意:如果遍历的wordDict.contains(temp)条件不满足,则不能设置该点flag为false,因为ture表示的为动态规划
* 求得的已知s满足字典要求的情况。
* */
for (int i=0;i<s.length();i++){
//如果字符串中该组合满足条件
for (boolean b : flag) {
System.out.print(b+" ");
}
System.out.println();
if(flag[i]) {
for (int k = i; k <s.length(); k++) {
//切割字符串
temp = s.substring(i, k+1);
if (wordDict.contains(temp)&& !flag[k+1]) {
flag[k+1] = true;
}
}
}
}
return flag[s.length()];
}
public static void main(String[] args) {
String s = "abcd";
List <String>wordDict = new ArrayList<>();
wordDict.add("a");
wordDict.add("b");
wordDict.add("abc");
wordDict.add("cd");
System.out.println("结果"+wordBreak(s,wordDict));
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。