Leetcode面试题 17.13. 恢复空格——综合题:字典树+dp+倒序思想

2023-11-17

文章目录

引入

今天终于把面试题 17.13. 恢复空格这道放着好久没做的题给做了,确实做这样一道题要拐很多弯,需要一定量的积累。

题目就暂时不放出来了,拿到这道题的第一反应,我也确实想到了字典树(ps:刚才去翻了翻博客日志,居然没有写过字典树相关的介绍,一会在下文我会写上)。

使用字典树只是题解里面的一个步骤,看到挨个判断字符串的每个字符是否在字典里的时候,我又想到了回溯算法,也就是遍历的时候,对于每一个字符,去判断是否能从这个字符开始,单独形成一个单词。
简单的说,就比如"abcd",字典[“ab”,“bc”],在判断第二个字符b的时候,需要去考虑“ab”的情况和“bc”的情况,如果使用递归,就要单独弄出一个新的递归函数来判断“bc”的情况。

使用递归,估计复杂度过不了,应该还要使用一个剪枝。剪枝却十分麻烦,我有一个比较麻烦的思路,在此不做赘述了。另外,回溯需要传入的参数也是比较多的,不做推荐。

所以,这道题使用回溯,算是比较麻烦的情况。

俗话说的好,凡是能用回溯的地方,都能用dp,这道题dp很好假设:
dp[i]表示:前i个字符最多有dp[i]个字符没有被识别出来。
初始化条件也很简单,dp[0]=0就行了。

不过在考虑dp的时候,怎么去做状态转移方程呢?
一种方法是从j=0开始,判断j到i的字典有没有在字典树里,但是这种方法和使用Set没什么区别。
另一种很好的做法是,字典树倒序,从最后一个字符往前判断。这样只要有不匹配的情况,前面的肯定也是不匹配的了。

接下来就介绍下题解。

字典树

首先说说字典树,字典树其实就是树,含有26个字母的树。
树的节点如下:

	class Node {
        //字典树
        Node[] dict = new Node[26];
        boolean isEnd;

        public Node() {
            this.isEnd = false;
        }
    }

可以看出,其实就是个多叉树,其中加入了个isEnd的判断,用于表示一个单词是否到了结尾。

字典树的初始化方式如下:

        //初始化字典树
        Node dummy = new Node();
        for (String word : dictionary) {
            Node point = dummy;
            for (int i = word.length() - 1; i >= 0; i--) {//将单词倒序放入字典树
                int pos = word.charAt(i) - 'a';
                if (point.dict[pos] == null) point.dict[pos] = new Node();
                point = point.dict[pos];
                //如果是单词最后一个字符,那么单词结束
                if (i == 0) point.isEnd = true;
            }
        }

题解

使用倒序+字典树的方式会好很多,可以关注一下i和j是如何走的。
代码如下:

import java.util.*;

public class Solution {
    class Node {
        //字典树
        Node[] dict = new Node[26];
        boolean isEnd;

        public Node() {
            this.isEnd = false;
        }
    }

    public int respace(String[] dictionary, String sentence) {
        //初始化字典树
        Node dummy = new Node();
        for (String word : dictionary) {
            Node point = dummy;
            for (int i = word.length() - 1; i >= 0; i--) {//将单词倒序放入字典树
                int pos = word.charAt(i) - 'a';
                if (point.dict[pos] == null) point.dict[pos] = new Node();
                point = point.dict[pos];
                if (i == 0) point.isEnd = true;
            }
        }
        //使用动态规划,dp[i]表示前i个字母,未被识别的有dp[i]个。
        int LEN = sentence.length();
        int[] dp = new int[LEN + 1];
        //初始化dp[0]=0;
        for (int i = 0; i < sentence.length(); i++) {
            dp[i + 1] = dp[i] + 1;//首先默认在该位置没有匹配
            Node point = dummy;
            for (int j = i; j >= 0; j--) {
                int pos = sentence.charAt(j) - 'a';
                if (point.dict[pos] != null) {
                    point = point.dict[pos];
                    if (point.isEnd) {
                        //如果查找到一个单词
                        dp[i + 1] = Math.min(dp[j], dp[i + 1]);
                    } else {
                        //没有查找到单词,继续向前找
                        dp[i + 1] = Math.min(dp[j+1] + (i - j), dp[i + 1]);
                    }
                } else {
                    //说明查找不到单词了
                    dp[i + 1] = Math.min(dp[j+1] + (i - j), dp[i + 1]);
                    break;
                }
            }
        }
        return dp[LEN];
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode面试题 17.13. 恢复空格——综合题:字典树+dp+倒序思想 的相关文章

  • 数字三角形之动态规划(C语言实现)

    算法步骤 1 首先构造三个数组 第一个是存储三角形初始值的数组data 第二个是存储顶点到该点最大值的res 数组 第三个是存储该点上一个点的loc 数组 这里要对res 数组进行初始化 1 2 按照三角形的层次结构 从上到下 从左到右依次
  • mysql存储过程游标之loop循环

    mysql存储过程游标 一共有3中循环方式 while repeat loop loop DELIMITER CREATE PROCEDURE DAY081002 BEGIN 定义参数 后面使用 DECLARE a INT DECLARE
  • 前端面试总结

    1 引言 最近参加了大量的招聘会 投递了大量的简历 整整体会了从 随便找个厂上一下 还是的找个大厂 没人要 急了急了 海投一波 工资有点尬 海投中 简单说一下自己的一些感受吧 现在的前端属实有点尴尬 前端的基础教程特别多 最开始本来是觉得自
  • Stata输出统计结果到Excel或word

    目录 一 安装外部包 二 相关命令 三 实例 1 描述性统计结果输出 2 相关性结果输入 3 回归结果输出 1 单模型结果 2 多模型结果 参考 一 安装外部包 在Stata内安装外部包 estout和logout ssc install
  • CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN

    摘要 本文从网络体系结构的角度出发 提出了跨阶段局部网络 CSPNet 来解决以往工作中需要大量推理计算的问题 本文将问题归结为网络优化中的重复梯度信息 所提出的网络通过从网络阶段的开始和结束集成特征映射来注重梯度的可变性 CSPNet易于

随机推荐

  • Flink常用算子总结

    Streaming 算子 Map 将元素处理转换 再输出 map算子对一个DataStream中的每个元素使用用户自定义的Mapper函数进行处理 每个输入元素对应一个输出元素 最终整个数据流被转换成一个新的DataStream 输出的数据
  • 2020年黑苹果硬件配置推荐

    前言 黑苹果硬件配置推荐是一件众口难调的事情 但是为了更多的苹果Mac爱好者能够早日开心顺利的使用上macOS系统 mac996站长还是会200 的努力做好这件事情 也请大家大家多给一些支持和鼓励 注 本文仅针对黑苹果台式机做硬件推荐 不涉
  • 协同过滤算法的一些报错及python函数学习

    文章目录 1 cannot import name jaccard similarity score 2 DataFrame object has no attribute dtype 3 sort values 4 sort index
  • 2023前端面试题及答案整理(JS笔试题)

    JS笔试题 JS类型相关 typeof 没定义的变量会报错吗 typeof let定义了的呢 未声明的变量使用 typeof 返回字符串 undefined typeof 一个 let 定义的变量会因为暂时性死区报错 前提 let cons
  • go语言面试题

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 同级文件的包名不允许有多个 是否正确 4 下面的代码有什么问题 请说明 1 下面这段代码输出什么 func main count 0 for i range 256 struct
  • webpack 学习笔记(二) 打包 AMD模块时 js路径错误

    在使用webpack打包模块的时候遇到的问题 各种百度一直无法解决这个问题 真的对新手太不友好了 webpack 作为 一个模块打包工具 它可以将AMD CMD CommonJs ES6 模块都进行打包 这里推荐一个讲解模块比较详细的博客
  • 华为机考108题(c++)(1-16)

    HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末尾不以空格为结尾 输入描述 输入一行 代表要计算的字符串 非空 长度小于5000 输出描述 输出一个整数 表示输入字符
  • C语言算法--冒泡排序

    C语言算法 冒泡排序 1 什么是冒泡排序 冒泡排序是一种简单的排序算法 它通过比较相邻元素的大小 并根据需要交换它们的位置来排序数据 它的名称来自于越小的元素会慢慢 冒泡 到数组的开头 冒泡排序的基本思想是从数组的第一个元素开始 依次比较相
  • 修改本机localhost映射dns解析

    去C Windows System32 drivers etc目录下找到hosts文件 进入修改 最后一行添加127 0 0 1 空格 写自己的域名映射 增加后进入cmd命令行窗口输入ipconfig flushdns刷新dns解析 此后就
  • 开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

    不论您是一名开发者 架构师 CTO 如果您曾深度参与在微服务开发中 那么相信您一定有过开源微服务框架或体系选型的疑问 Apache Dubbo Spring Cloud gRPC 以及 Service Mesh 体系产品如 Istio 到底
  • Vinted店铺为什么被封?如何应对?

    Vinted是一家在线二手交易平台 专门用于买卖衣物和时尚配件 自从2022年以来 Vinted也越来越向综合性跨境电商平台转变 细心的伙伴都会发现 近来Vinted这阵子封号确实很严重 感觉是风控变严格了 但是万变不离其宗 说到底封控还是
  • librdkafka编译及简单使用过程简介

    librdkafka 使用了 C 11 使用 VS2010 无法编译 需要使用更高版本的 VS 才能编译 我这里使用的是 VS2017 1 编译版本 编译环境 windows VS2017 openssl 版本 openssl 1 0 2t
  • VRTK——UI控制(点击按钮)

    1 Canvas必须带有VRTK UICanvas脚本 2 LeftControllerScriptAlias RightControllerScriptAlias必须有 VRTK ControllerEvents VRTK Pointer
  • 如何在 Python 和 Node.js 之间通信 JSON 数据?

    JSON 可以缩写为 JavaScript Object Notation 它是一个基于文本的文件 用于在编程语言中传输和存储数据 它由使用内置包即 JSON 的 python 编程语言支持 其文本以带引号的字符串格式给出 其中在大括号 中
  • git Bash上传本地项目到github

    首先登陆个人github账号新建一个仓库 新建好仓库后打开要上传的项目所在位置 右键文件夹 选择Git Bash Here 第一步 git init初始化 第二步 git add 添加到仓库 注 出现警告的话再输入一次 第三步 git co
  • 如何解决ImportError: cannot import name ‘BatchNormalization‘ from ‘keras.layers.normalization‘

    报错如下所示 其实就是版本的问题 改之前的代码 from keras layers normalization import BatchNormalization 改之后 from keras layers normalization ba
  • imx6ull驱动开发经验

    1 背景 imx6ull驱动开发基于正点原子的开发板 上面运行linux 4 1 15内核 根文件系统为ubuntu 16 05 5 LTS 2 加载驱动文件chrdevbase ko文件时 先使用depmod生成依赖文件时 提示无modu
  • 对利用Python爬取到的房价信息做数据可视化(附完整代码)

    大家好 我是带我去滑雪 每天教你一个小技巧 1 数据展示 本文利用Python爬取到的房价信息做数据可视化 爬取数据的文章见 利用Python爬取房价信息 附代码 用python爬取房价数据 带我去滑雪的博客 CSDN博客 所爬取的指标有小
  • PyQt4 精彩实例分析* 实例7 表格的使用

    制作统计软件时经常会使用表格将资料列出 或是通过表格进行资料的设置 在Qt中可以使用QTableWidget实现一个表格 本实例演示如何使用表格 并在表格中嵌入控件 如下图所示为 表格的使用 对话框 QTableWidget类提供了一个灵活
  • Leetcode面试题 17.13. 恢复空格——综合题:字典树+dp+倒序思想

    文章目录 引入 字典树 题解 引入 今天终于把面试题 17 13 恢复空格这道放着好久没做的题给做了 确实做这样一道题要拐很多弯 需要一定量的积累 题目就暂时不放出来了 拿到这道题的第一反应 我也确实想到了字典树 ps 刚才去翻了翻博客日志