2707. 字符串中的额外字符 - 力扣(LeetCode)
思路:
使用动态规划,尝试寻找子问题。
递:从上向下
归:从下向上
dfs(i) 表示以i结尾的子问题,对于字符i,有两种情况,选还是不选。如果不选,dfs(i) = dfs(i - 1) + 1, 如果选,需要遍历每一种情况,看是否满足条件,并找出最小值。dfs(i) = min(j - > i)(dfs(j - 1))。最终的答案是两种情况的最小值。
总结:
1. 动态规划可以看作是没有思路的一种尝试,尝试从思考子问题开始,这道题的情况是选还是不选。
2. 判断是否包含某个元素,使用set快速判断,这道题目中判断字串的一部分是否在集合中,通过使用substring方法截取字串,然后使用set判断。
代码:
class Solution {
private Set<String> set = new HashSet<>();
public int minExtraChar(String s, String[] dictionary) {
int n = s.length();
// 初始化set
for(String str : dictionary) {
set.add(str);
}
int[] f = new int[n + 1];
for(int i = 0; i < n; i++) {
// 当前字符不选
int res = f[i] + 1;
// 当前字符选
for(int j = 0; j <= i; j++) {
if(set.contains(s.substring(j, i + 1))) {
res = Math.min(res, f[j]);
}
}
// 结果
f[i + 1] = res;
}
return f[n];
}
}
参考: