【算法与数据结构】139、LeetCode单词拆分

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:本题可以看做一个动态规划问题。其中,字符串s是背包,而字典中的单词就是物品。题目问的是单词能否组成字符串s,就是问物品能不能把背包装满。字典中的单词可以重复使用,因此是一个完全背包问题。

  • 第一步, d p [ j ] dp[j] dp[j]的含义。 d p [ j ] dp[j] dp[j]代表的是字符串长度为 j j j时,该能否由字典中的单词构成。如果能,则为true。
  • 第二步,递推公式。如果确定 d p [ j ] dp[j] dp[j]是true,且 [ j , i ] [j, i] [j,i]这个区间的子串出现在字典里,那么 d p [ i ] dp[i] dp[i]一定是true。 ( j < i ) (j < i ) (j<i)。所以递推公式是:
    if(dp[j] &&  [j, i]这个区间的子串出现在字典里) dp[i] = true
    
  • 第三部,元素初始化。 d p [ 0 ] dp[0] dp[0]初始化为1。
  • 第四部,递归顺序。本题严格划分起来是一个排列问题。以s = “applepenapple”, wordDict = [“apple”, “pen”] 为例。我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。“apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。所以说,本题一定是先遍历背包,再遍历物品
  • 第五步,打印结果。
      为了判断 [ j , i ] [j, i] [j,i]这个区间的子串出现在字典里,我们构建了一个无序集合。其底层实现是一个哈希表,可以在常数时间内( O ( 1 ) O(1) O(1))内进行查找。
      程序如下
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, 0);dp[0] = 1;for (int i = 1; i <= s.size(); i++) {	// 遍历背包(字符串s)for (int j = 0; j < i; j++) {		// 遍历物品(单词)string key = s.substr(j, i - j);if (dp[j] && wordSet.find(key) != wordSet.end()) {dp[i] = 1;}}}return dp[s.size()];}
};

复杂度分析:

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)。除了两层循环以外,还有需要substr返回子串,它是O(n)的复杂度(这里的n是substring的长度)。
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <vector>
# include <string>
# include <unordered_set>
using namespace std;class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, 0);dp[0] = 1;for (int i = 1; i <= s.size(); i++) {	// 遍历背包(字符串s)for (int j = 0; j < i; j++) {		// 遍历物品(单词)string key = s.substr(j, i - j);if (dp[j] && wordSet.find(key) != wordSet.end()) {dp[i] = 1;}}}return dp[s.size()];}
};int main() {string s = "catsandog";vector<string> wordDict = { "cats", "dog", "sand", "and", "cat" };Solution s1;bool result = s1.wordBreak(s, wordDict);cout << result << endl;system("pause");return 0;
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437815.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 交换排序 快速排序 hoare版代…

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作&#xff1a;并发修改异常增强循环遍历数组&#xff1a;遍历集合&#xff1a;遍历字符串&#xff1a;限制 list接口ListIteratorArrayList创建 ArrayList&#xff1a;添加元素&#xff1a;获取元素&#xff1a;修…

如何在Microsoft Teams会议中开启元宇宙教学模式

在之前的文章中我们分享了如何在Microsoft Teams中搭建元宇宙的教学场景&#xff0c;通过在Teams中的某个组里添加“选项卡”的形式进行元宇宙的场景搭建和使用。 今天我们来继续介绍如何通过Teams的会议模式来使用元宇宙。首先&#xff0c;进入Teams后点击右上角的“会议”。 …

HarmonyOS --@state状态装饰器

在声明式UI中&#xff0c;是以状态驱动视图更新。 状态&#xff08;state&#xff09;&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09;。 试图&#xff08;view&#xff09;&#xff1a;基于UI描述渲染得到用户界面 State装饰器标记的变量必须初…

promethues基础概念

promethues是一个开源的系统监控以及报警系统&#xff0c;整个zabbix的功能&#xff0c;系统&#xff0c;网络&#xff0c;设备 promethues可以兼容网络和设置被&#xff0c;容器监控&#xff0c;告警系统&#xff0c;因为他和k8s是一个项目基金开发的产品&#xff0c;天生匹配…

烟台莱州市事业单位报名流程及照片审核处理方法图文详解

烟台莱州市的事业单位招聘考试一直是众多求职者关注的焦点&#xff0c;今年也不例外。随着招聘季的到来&#xff0c;烟台莱州市的事业单位报名工作已经正式启动。对于有意向加入莱州市事业单位的朋友们来说&#xff0c;这是一个不容错过的机会。小编已经为大家精心准备了详细的…

Flink Checkpoint 超时问题详解

第一种、计算量大&#xff0c;CPU密集性&#xff0c;导致TM内线程一直在processElement&#xff0c;而没有时间做CP【过滤掉部分数据&#xff1b;增大并行度】 代表性作业为算法指标-用户偏好的计算&#xff0c;需要对用户在商城的曝光、点击、订单、出价、上下滑等所有事件进…

Java8-Stream 流基本应用-groupBy进行分组

groupBy进行分组 Testpublic void testStreamGroupBy(){List<UserInfoModel> resultnew ArrayList<>();for (int i 0; i < 10; i) {UserInfoModel usernew UserInfoModel();user.setUserId(i"");user.setUserName("kangshihang");result.a…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

5、主成分分析(Principal Component Analysis)

通过分析变异发现新特征。 文章目录 1、简介2、主成分分析3、PCA用于特征工程4、示例 - 1985年的汽车1、简介 在上一课中,我们研究了我们的第一个基于模型的特征工程方法:聚类。在这一课中,我们将研究我们的下一个方法:主成分分析(PCA)。就像聚类是基于接近度对数据集进…

如何通俗解释Docker是什么?

要想弄懂Docker&#xff0c;咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化&#xff0c;它是一种轻量级、可移植的软件打包方式&#xff0c;你就想象成一个快递箱子&#xff0c;里面装着你的应用和所有需要运行的环境&#xff0c;这个箱子能在任何支持容器…

【openGauss】openEuler 22.03 LTS 安装了openGauss数据库后yum不可用

问题描述 尝试使用yum时出现依赖包缺少依赖版本的问题&#xff0c;主要问题时在安装openGauss时&#xff0c;通过脚本创建omm用户和dbgrp组导致的&#xff0c;如果用户和组是提前创建好的就不会出现这样的问题 报错&#xff1a;version GLIBCXX_3.4.26’ not found 报错信息 …