程序员面试金典 17.13

Re-Space:给定一个字典和一个句子,根据字典将句子进行拆分,使得最终不在字典中的字母数量最少。

最近刷的比较慢,一是因为白天实习没什么功夫,二是因为书上的解法也可能过不了了,三是题确实难了,光凭打印调试效率太低了,看来应该是不能白板写代码了。

最暴力的方法就是依次尝试在每个可能的地方进行拆分,并在所有的可能中选取最优解,时间复杂度为O(2 ^ n)n为句子sentence的长度,从输入数据规模来看,会达到2 ^ 1000,所以需要通过剪枝和记忆化的搜索来进行优化。剪枝的方法就是在拆分的过程中就计算已经拆分好的部分的无效字符数量。虽然通过了所有的71个测试用例,但是依然超时了,但是当我把dict的类型从set<string>换成unordered_set<string>后就过了,我只能说太蠢了。

class Solution {
private:
    unordered_set<string> dict;
    vector<int> Mem;
    int respace(const string &sentence, int idx)
    {
        if(idx == static_cast<int>(sentence.size())) return 0;
        if(Mem[idx] != INT_MAX) return Mem[idx];
        string part;
        int best = INT_MAX;
        for(int i = idx; i < static_cast<int>(sentence.size()); i++)
        {
            part.push_back(sentence[i]);
            int invalid = dict.find(part) != dict.end() ? 0 : part.size();
            if(invalid < best){
                int RestInvalid = respace(sentence, i + 1);
                if(invalid + RestInvalid < best){
                    best = invalid + RestInvalid;
                }
            }
        }
        Mem[idx] = best;
        return Mem[idx];
    }
public:
    int respace(vector<string> &dictionary, string sentence) {
        if(sentence.empty()) return 0;
        for(const string &word : dictionary)
        {
            dict.insert(word);
        }
        Mem.assign(sentence.size(), INT_MAX);
        respace(sentence, 0);
        return Mem[0];
    }
};

上面的解法需要在确定所有拆分的位置后,才能计算sentence的总无效值,但是由于进行了剪枝优化,在递归的过程中就计算了部分的无效值。更好的方法是在每考察sentence中的一个字符时,就计算当前整体的最优值,类似背包问题,每当加入一个字符时,尝试将该字符作为所有字串的末尾,计算得到一个最小的无效值。

class Solution {
private:
    unordered_set<string> dict;
public:
    int respace(vector<string>& dictionary, string sentence) {
        if(sentence.empty()) return 0;
        for(const string &word : dictionary)
        {
            dict.insert(word);
        }
        vector<int> Invalid(1, 0);
        for(size_t i = 1; i <= sentence.size(); i++)
        {
            Invalid.push_back(Invalid.back() + 1);
            for(const string &word : dict)
            {
                size_t len = word.size();
                if(len <= i && word == sentence.substr(i - len, len)){
                    if(Invalid[i - len] < Invalid[i]){
                        Invalid[i] = Invalid[i - len];
                    }
                }
            }
        }
        return Invalid.back();
    }
};
代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
### 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的各项参数设定以便日后恢复使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值