LeetCode 2707. 字符串中的额外字符

一、题目

1、题目描述

给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串,每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。

请你采取最优策略分割 s ,使剩下的字符 最少 。

2、接口描述

class Solution {
public:
    int minExtraChar(string s, vector<string>& dictionary) {
        
    }
};

3、原题链接

2707. 字符串中的额外字符


二、解题报告

1、思路分析

和上周周赛题目类似,也是分割字符串,我们可以用动态规划将问题划分为子问题

定义状态dp[i]为前i个字符最优划分后的最少额外字符,那么有转移方程:

dp[i] = dp[ i -1],将第i个字符作为额外字符

dp[i] = min(dp[i] , dp[j - 1]),其中第j个字符到第i个字符在字典中

最终返回dp[n]即可

进行状态转移,如果暴力计算子串是否在字典中,显然复杂度过高

如果将字典中字符串存入哈希表,那么每次状态转移为n * 2,因为我们要从(i , i)计算到(1 , i)

这里就涉及到查询字符串优化的常用策略,将目标字符串倒序存入字典树,然后倒序查询可以满足一次遍历完成查询,关于字典树见:Trie树/字典树的原理及实现[C/C++]-CSDN博客

2、复杂度

时间复杂度:O(n^2 + ml) 空间复杂度:O(m l * 26)

3、代码详解

class Solution
{
public:
    struct Node
    {
        bool isword = false;
        unordered_map<char, Node *> child;
    } root;
    void insert(string &s)
    {
        Node *cur = &root;
        for (int i = s.size() - 1; i >= 0; i--)
        {
            if (!cur->child.count(s[i]))
                cur->child[s[i]] = new Node;
            cur = cur->child[s[i]];
        }
        cur->isword = true;
    }
    int minExtraChar(string s, vector<string> &dictionary)
    {
        root.child.clear();
        for (auto &x : dictionary)
            insert(x);
        int n = s.size();
        vector<int> dp(n + 1, INT_MAX);
        dp[0] = 0;
        for (int i = 1; i <= n; i++)
        {
            dp[i] = dp[i - 1] + 1;
            Node *cur = &root;
            for (int j = i; j >= 1; j--)
            {
                if (!cur->child.count(s[j - 1]))
                    break;

                cur = cur->child[s[j - 1]];
                if (cur->isword)
                    dp[i] = min(dp[i], dp[j - 1]);
            }
        }

        return dp[n];
    }
};

相关推荐

  1. LeetCode 2707. 字符串额外字符

    2024-01-10 01:04:03       41 阅读
  2. LeetCode每日一题 | 2707. 字符串额外字符

    2024-01-10 01:04:03       43 阅读
  3. 【力扣每日一题】力扣2707字符串额外字符

    2024-01-10 01:04:03       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-10 01:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-10 01:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-10 01:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-10 01:04:03       18 阅读

热门阅读

  1. 【OCR】 - Tesseract OCR在mac系统中安装

    2024-01-10 01:04:03       39 阅读
  2. 【Spark精讲】SparkSQL Join选择逻辑

    2024-01-10 01:04:03       27 阅读
  3. C++之模板类template

    2024-01-10 01:04:03       27 阅读
  4. 2024年湖北建设厅建筑七大员怎么报考?

    2024-01-10 01:04:03       37 阅读
  5. Linux 编辑器和文本处理

    2024-01-10 01:04:03       31 阅读
  6. 面试题总结(1.8)

    2024-01-10 01:04:03       27 阅读
  7. C#,C++实现:华为经典笔试题_菜单组合种类题目

    2024-01-10 01:04:03       32 阅读
  8. arch modelsim 解决无法运行

    2024-01-10 01:04:03       32 阅读
  9. 算法学习:动态规划之爬楼梯问题

    2024-01-10 01:04:03       39 阅读
  10. 学习Go语言Web框架Gee总结--中间件Middleware(五)

    2024-01-10 01:04:03       51 阅读
  11. 深入PostgreSQL:高级函数用法探索

    2024-01-10 01:04:03       44 阅读