🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害
300. 最长递增子序列
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的
子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
解题思路
- 创建一个和原数组长度相同的数组
dp
,用来存放到每个位置为止的最长递增子序列的长度。 - 初始化
dp[i]
为 1(因为每个单独的元素本身就是一个递增子序列)。 - 对于每个位置
i
,遍历其之前的位置j
,如果nums[j] < nums[i]
,则更新dp[i] = Math.max(dp[i], dp[j] + 1)
。 - 最终,
dp
数组中的最大值即为最长递增子序列的长度。
代码实现
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int n = nums.length;
int[] dp = new int[n];
Arrays.fill(dp, 1);
int maxLength = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
maxLength = Math.max(maxLength, dp[i]);
}
return maxLength;
}
}
139. 单词拆分
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s
则返回 true
。
**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
解题思路
- 创建一个布尔数组
dp
,dp[i]
表示从字符串s
的开头到第i
个字符是否可以被字典拆分。 - 初始化
dp[0]
为true
,因为空字符串可以被拆分为字典内的单词。 - 遍历字符串
s
,对于每个位置i
,遍历之前的位置j
(0 <= j < i
),如果dp[j]
为true
且从位置j
到位置i
的子串在字典中存在,则更新dp[i] = true
。 - 最后返回
dp[s.length()]
的值。
代码实现
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> dict = new HashSet<>(wordDict);
int n = s.length();
boolean[] dp = new boolean[n + 1];
dp[0] = true;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && dict.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}
return dp[n];
}
}