139、单词拆分
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。请你判断是否可以利用字典中出现的单词拼接出 s
。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
单词拼接——所以单词的顺序肯定不同,答案就会不同。所以这个是完全背包的排列顺序问题
故:先遍历背包,再遍历物品
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
//完全背包问题——排列+存在问题
//背包容量 s.length() 物品重量wordDict的每一个单词
boolean []dp=new boolean[s.length()+1];//dp[i]:表示字符串s的前i个字符能否拆分成wordDict
dp[0]=true;
//排列——遍历背包再遍历物品
for (int j = 0; j <= s.length(); j++) {
for (String word : wordDict) {
int length = word.length();
//背包的容量j一定要大于物品的重量length
if (j >= length && word.equals(s.substring(j - length, j))) {
dp[j] = dp[j] || dp[j - length];
}
}
}
return dp[s.length()];
}
}
279、完全平方数
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
题目意思:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
物品重量是i*i,所以遍历背包容量时,从物品重量i*i开始遍历
class Solution {
public int numSquares(int n) {
//完全背包问题——最值问题
//背包容量:n 物品重量:i*i 物品价值:1
int []dp=new int[n+1];//dp[i]:表示当n为i时,最少能用多少数量的平方和等于i
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0]=0;//表示当n为0是,有0种方法
//先遍历物品,再遍历背包
//i*i<=n 取得到等号
for(int i=1;i*i<=n;i++){
for(int j=i*i;j<=n;j++){
if((j-i*i)!=Integer.MAX_VALUE){
dp[j]=Math.min(dp[j],dp[j-i*i]+1);
}
}
}
return dp[n];
}
}