面试题 17.13. 恢复空格

本文介绍了一种基于字典树和动态规划的断词算法,旨在将一篇去除空格和标点的文章断成词语,同时最小化未识别字符的数量。通过使用字典树进行前缀匹配和动态规划求解最优解,该算法能够有效处理长篇文章的断词任务。

哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。

注意:本题相对原题稍作改动,只需返回未识别的字符数

示例:
输入:
dictionary = [“looked”,“just”,“like”,“her”,“brother”]
sentence = “jesslookedjustliketimherbrother”
输出: 7
解释: 断句后为"jess looked just like tim her brother",共7个未识别字符。

来源:力扣(LeetCode)添加链接描述

暴力动态规划:

class Solution {
public:
    int respace(vector<string>& dictionary, string sentence) {
        int n = sentence.size();
        int dp[n+1];
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
            dp[i] = dp[i-1] + 1;
            for(auto &word : dictionary) {
                if(word.size() <= i) {
                    if(word == sentence.substr(i-word.size(), word.size())) {
                        dp[i] = min(dp[i], dp[i-word.size()]);
                    }
                }
            }
        }
        return dp[n];
    }
};

字典树:

class Trie {
    public:
    Trie *next[26] = { NULL };
    bool isEnd;

    Trie(){
        isEnd = false;
    }
    void insert(string w) {
        int n = w.size();
        Trie *cur = this;

        for(int i = n-1; i >= 0; i--) {
            int j = w[i] - 'a';
            if(cur->next[j] == NULL) {
                cur->next[j] = new Trie();
            }
            cur = cur->next[j];
        }
        cur->isEnd = true;
    }
};

class Solution {
public:
    int respace(vector<string>& dictionary, string sentence) {
        Trie *root = new Trie();
        for(auto &word : dictionary) {
            root->insert(word);
        }

        int n = sentence.size();
        int dp[n+1];

        dp[0] = 0;

        for(int i = 1; i <= n; i++) {
            dp[i] = dp[i-1] + 1;
            Trie *cur = root;
            for(int j = i; j >= 1; j--) {
                int t = sentence[j-1] - 'a';
                if(cur->next[t] == NULL) break;
                else if(cur->next[t]->isEnd){
                    dp[i] = min(dp[i], dp[j-1]);
                }
                cur = cur->next[t];
            }

        }
        return dp[n];
    }
};
### Visual Studio 17.13.0 版本特性 Visual Studio 17.13.0 提供了一系列新特性和改进,旨在提升开发效率和用户体验。此版本增强了对多种编程语言的支持,并引入了一些新的工具和服务。 - **性能优化**:显著提高了启动速度以及大型项目中的编辑体验。 - **调试器增强**:增加了更强大的断点设置选项和支持异步方法调用栈可视化[^1]。 - **Live Share 改进**:允许开发者实时协作编码并共享终端会话。 - **Azure 集成加强**:简化云端资源管理和部署流程。 - **C++.NET 开发支持**:提供了更好的 IntelliSense 功能和其他生产力辅助功能。 ### 安装指南 为了顺利安装 Visual Studio 17.13.0,请遵循以下指导: #### 准备工作 确保计算机满足最低硬件要求,并关闭所有正在运行的应用程序以减少潜在冲突。 #### 下载与执行安装文件 访问官方网站获取最新版的安装程序,并按照提示完成下载过程。双击.exe 文件启动图形化向导界面。 #### 自定义组件选择 在安装过程中可以选择所需的工作负载(Workloads),这些预配置好的集合包含了特定领域所需的全部工具集。对于大多数用户而言,默认推荐的选择已经足够全面;但对于有特殊需求的情况,则可以根据实际情况调整勾选项。 #### 更新现有实例 如果之前已有旧版本存在,在安装时会被自动检测到,并提供升级路径来保留自定义设置和个人资料。 ```bash # 如果遇到权限不足的问题可以尝试管理员模式重新打开命令行窗口再试一次 vs_installer modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\2022\Community" ``` ### 常见问题解决方案 针对可能出现的一些典型难题给出相应对策如下: - **无法加载某些扩展插件** 这可能是由于兼容性问题引起的。可以通过禁用不必要的附加组件或者回滚至稳定版本的方式解决问题。另外也可以查看官方论坛是否有其他用户的相似反馈及其处理办法。 - **编译报错但无具体提示信息** 尝试清理解决方案(`Build -> Clean Solution`)后再重建整个工程(`Rebuild All`)。同时确认所有的依赖库都已经被正确引用并且版本匹配。 - **更新后原有配置丢失** 当进行大版本迭代之后确实有可能会出现这种情况。建议提前做好备份措施,比如导出当前IDE的各项参数设定以便日后恢复使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值