【LeetCode每日一题】2707. 字符串中的额外字符(哈希表+动态规划)

2024-1-9

文章目录

    • [2707. 字符串中的额外字符](https://leetcode.cn/problems/extra-characters-in-a-string/)
        • 思路:哈希表+动态规划

2707. 字符串中的额外字符

【LeetCode每日一题】2707. 字符串中的额外字符(哈希表+动态规划)_第1张图片

思路:哈希表+动态规划

1.将字典中的所有字符串存储在一个HashSet集合中。

2.定义一个状态数组 f,其中f[i]表示将原字符串s的前i个字符转换为一个完整的单词所需的最少添加字符数。

初始时,我们将f数组的所有元素初始化为i,表示在第i个位置之前都需要添加字符才能组成一个单词。

3.接下来,开始进行状态转移。对于每一个位置i,我们从0到i枚举选取子串的起始位置j。如果字典中包含选取的子串s.substring(j, i + 1),则说明我们可以使用这个子串来构成一个单词。此时,我们可以通过更新f[i+1]的值来记录当前状态。具体而言,我们更新f[i+1]的值为f[j],

4.最后,返回f[n],其中n为字符串s的长度,即可得到最少需要添加的字符数。

//2707. 字符串中的额外字符
    public int minExtraChar(String s, String[] dictionary) {
        HashSet<String> set = new HashSet<String>(dictionary.length); // 创建一个HashSet集合用于存储字典中的字符串
        for (String str : dictionary) set.add(str); // 将字典中的字符串添加到集合中
        int n = s.length(); // 获取字符串s的长度
        int[] f = new int[n + 1]; // 创建一个数组f用于记录状态,长度为n+1
        for (int i = 0; i < n; i++) {
            f[i + 1] = f[i] + 1; // 初始化f数组,表示假设当前位置之前的字符都需要添加
            for (int j = 0; j <= i; j++) { // 从0到i枚举选取子串的起始位置
                if (set.contains(s.substring(j, i + 1))) { // 如果字典中包含选取的子串
                    f[i + 1] = Math.min(f[i + 1], f[j]); // 更新f[i+1]的值,取当前值和f[j]中的较小值
                }
            }
        }
        return f[n]; // 返回f数组的最后一个元素,即最少需要添加的字符数
    }

点击移步博客主页,欢迎光临~

偷cyk的图

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)