2025年--Lc193-139. 单词拆分(动态规划在字符串的应用)--Java版
1.题目
2.思路
(1)dp数组定义: dp[i] 表示 s 的前 i 个字符能否被拆分
wordDict 中的所有字符串互不相同,所以用set存储wordDict
(2)遍历顺序
起点一直右移,遍历所有子串。
外层 i 从 1 到 n:每次代表正在考虑前 i 个字符
内层 j 从 0 到 i-1:枚举最后一个单词的起点
3.代码实现
(1)写法1
class Solution {public boolean wordBreak(String s, List<String> wordDict) {//题目说wordDict 中的所有字符串 互不相同,所以用set存储字典的单词Set<String> wordDictSet=new HashSet<>(wordDict);int n=s.length();//定义dp数组boolean dp[]=new boolean[n+1];//代表空字符串, 空串一定可拆分dp[0]=true;//因为字符串的先后顺序对拼接是有影响的,所以用排列,先遍历背包再遍历物品for(int i=1;i<=n;i++)//背包,i从1开始,i=0的时候代表的是空字符串{for(int j=0;j<i;j++)// 4. 内层遍历“物品” j = 0 … i-1(尝试最后一个单词的起点){//首先遍历的dp[j]的子串是存在的// 5. 如果前 j 个字符可拆分,且 s[j…i-1] 在字典中if(dp[j]==true&&wordDictSet.contains(s.substring(j,i))){dp[i]=true;break;}}}return dp[n];}
}
(2)写法2:
class Solution {public boolean wordBreak(String s, List<String> wordDict) {//题目说wordDict 中的所有字符串 互不相同,所以用set存储字典的单词//把 wordDict 里的内容放入到 Set 中//Set<String> wordDictSet=new HashSet<>(wordDict);Set<String> wordDictSet=new HashSet<>();wordDictSet.addAll(wordDict);int n=s.length();//定义dp数组boolean dp[]=new boolean[n+1];//代表空字符串, 空串一定可拆分dp[0]=true;//因为字符串的先后顺序对拼接是有影响的,所以用排列,先遍历背包再遍历物品for(int i=1;i<=n;i++)//背包,i从1开始,i=0的时候代表的是空字符串{for(int j=0;j<i;j++)// 4. 内层遍历“物品” j = 0 … i-1(尝试最后一个单词的起点){//首先遍历的dp[j]的子串是存在的// 5. 如果前 j 个字符可拆分,且 s[j…i-1] 在字典中if(dp[j]==true&&wordDictSet.contains(s.substring(j,i))){dp[i]=true;break;}}}return dp[n];}
}