力扣 139. 单词拆分

news2024/11/16 3:34:44

一、题目描述

给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。

示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

二、题解

通过回溯法进行暴力求解,时间复杂度 O ( n × 2 n ) O(n \times 2^n) O(n×2n),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &word_dict) {
        unordered_set<string> word_set(word_dict.begin(), word_dict.end());

        return backtracking(s, word_set, 0);
    }

private:
    bool backtracking(string &s, unordered_set<string> &word_set, int begin_index) {
        if (begin_index == s.size()) {
            return true;
        }

        for (int i = begin_index; i < s.size(); i++) {
            string temp = s.substr(begin_index, i - begin_index + 1);
            if (word_set.find(temp) != word_set.end()) {
                /* temp在字典中存在 */
                if (backtracking(s, word_set, i + 1)) {
                    /* 拼接成功 */
                    return true;
                }
            }
        }

        return false;
    }
};

上述方法在递归的过程中有很多重复计算,可以使用数组保存一下递归过程中计算的结果,虽然时间复杂度和空间复杂度没有改变,但是进行了大量剪枝,从而实现了优化。

通过回溯法进行记忆化递归求解,时间复杂度 O ( n × 2 n ) O(n \times 2^n) O(n×2n),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &word_dict) {
        unordered_set<string> word_set(word_dict.begin(), word_dict.end());
        vector<bool> valid_tag(s.size(), true); // true表示初始值,false表示从当前下标开始无法完成拼接

        return backtracking(s, word_set, valid_tag, 0);
    }

private:
    bool backtracking(string &s, unordered_set<string> &word_set, vector<bool> &valid_tag, int begin_index) {
        if (begin_index == s.size()) {
            return true;
        }

        /* 之前已经处理过从begin_index开始的拼接了,并且最终无法完成拼接 */
        if(!valid_tag.at(begin_index)) {
            return false;
        }

        for (int i = begin_index; i < s.size(); i++) {
            string temp = s.substr(begin_index, i - begin_index + 1);
            if (word_set.find(temp) != word_set.end()) {
                /* temp在字典中存在 */
                if (backtracking(s, word_set, valid_tag, i + 1)) {
                    /* 拼接成功 */
                    return true;
                }
            }
        }

        /* 从begin_index开始无法完成拼接 */
        valid_tag.at(begin_index) = false;

        return false;
    }
};

通过动态规划求解,时间复杂度 O ( n 3 ) O(n^3) O(n3),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &word_dict) {
        unordered_set<string> word_set(word_dict.begin(), word_dict.end());
        vector<bool> dp(s.size() + 1, false);  // dp[i]为true表示字符串s[0:i-1]可以被成功拼接

        dp.at(0) = true; // 空字符串即s[0:-1]可以被匹配

        for (int i = 0; i < s.size(); i++) {
            for (int j = i; j < s.size(); j++) {
                string temp = s.substr(i, j - i + 1);
                if (word_set.find(temp) != word_set.end() && dp.at(i)) {
                    dp.at(j + 1) = true;
                }
            }
        }

        return dp.at(s.size());
    }
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文解读】Do Prompts Solve NLP Tasks Using Natural Language?

&#x1f365;关键词&#xff1a;文本分类、提示学习 &#x1f365;发表期刊&#xff1a;Arxiv 2022 &#x1f365;原始论文&#xff1a;https://arxiv.org/pdf/2203.00902 最近在做Prompted learning for text classification的工作&#xff0c;Prompted learning的核心在于设…

应急响应之进程,服务,文件排查方法

应急响应之进程,服务,文件排查方法 1.进程Windows进程排查Linux进程排查2.服务Windows服务排查Linux服务排查3.文件痕迹windows系统文件痕迹排查Linux系统文件痕迹排查1.进程 Windows进程排查 对于 Windows 系统中的进程排查,主要是找到恶意进程的 PID、程序路径, 有时还…

Elasticsearch:使用 Docker-Compose 启动单节点 Elastic Stack

首先必须指出的是&#xff0c;在我之前的文章 “Elasticsearch&#xff1a;使用 Docker compose 来一键部署 Elastic Stack 8.x”&#xff0c;我有详述根据官方文档如何创建一个带有三个节点的安全 Elasticsearch 集群。本文基于著名的 Deviatony 存储库和 Elastic 的官方说明。…

KPI考核管理:有效提升企业绩效指标

KPI考核管理是企业中常用的绩效管理方法之一&#xff0c;这种方式涉及到目标设定、绩效评估和奖惩措施等方面。在本文中&#xff0c;我们将探讨KPI考核管理的重要性、KPI管理方法以及如何应对。 一、KPI考核管理的重要性 KPI考核管理是企业实现战略目标的重要手段之一&#x…

[Mysql] MySQL索引与事务

黎明前的黑暗最难度过,但一旦坚持住,便是灿烂朝阳. 文章目录 1. 索引1.1 索引的概念1.2 索引的创建与使用 2. 事务2.1 事务的使用2.2 事务的特性与隔离机制2.2.1 隔离级别 1. 索引 1.1 索引的概念 索引是一种特殊的文件&#xff0c;可以对表中一列或多列创建索引&#xff0c;…

JZ-7Y-204 DC110V 2NO 2NC 静态中间继电器 板前接线 JOSEF约瑟

品牌&#xff1a;JOSEF约瑟名称&#xff1a;静态中间继电器型号&#xff1a;JZ-7Y-204额定电压&#xff1a;6V~220VAC/DC,380VAC触点容量&#xff1a;10A/250V10A/220VDC功率消耗&#xff1a;≤6W 1 用途 JZ-7中间继电器 板前接线用于各种保护和自动控制装置中&#xff0c;以…

PB文件定义为int64,HTTP返回为string的问题

最近开发遇见一个问题&#xff0c;pb文件中定义的一个字段类型为int64&#xff0c;而客户端拿到却是string。很奇怪&#xff0c;经过排查原来是 proto3中json映射问题 原文链接&#xff1a;https://protobuf.dev/programming-guides/proto3/#json JSON映射 Proto3 支持 JSON …

【GO 编程语言】 函数

函数 文章目录 函数一、什么是函数1.函数的声明 二、函数的声明和调用三、形参和实参四、可变参数五、值传递和引用传递六、函数中变量的作用域七、defer八、函数的本质探究九、匿名函数十、回调函数十一、闭包 一、什么是函数 函数是基本的代码块,用于执行一个任务。Go 语言最…

【手撕代码系列】JS手写实现apply方法

公众号&#xff1a;Code程序人生&#xff0c;分享前端所见所闻 在JavaScript中&#xff0c;apply()是Function对象的一个方法&#xff0c;它允许我们以指定的this值和参数列表调用函数。这个方法通常被用来在函数调用时动态地传递参数&#xff0c;或者在调用函数时绑定this值。…

chatgpt软件批量写作软件-文章改编软件

文章改编软件 文章改编软件是一种能够将原有的文本进行复制粘贴后&#xff0c;通过一定算法进行改写和改编的工具。其主要应用领域在于将一些内容复制到网站或博客等平台上时&#xff0c;避免因为重复内容而被识别为“抄袭”&#xff0c;从而提高文章的独特性和可读性。 然而…

TweenMax 源码阅读

GSAP 之 TweenMax 源码阅读&#xff08;一&#xff09; 一、背景 GreenSock &#xff08;绿袜子&#xff09; GreenSock 是一家做 专业级 JavaScript 动画的公司&#xff0c;主要产品就是其下的 GSAP (GreenSock Animation Platform)&#xff0c;配合着 GSPA 开发了很多专业的…

前端架构师-week5-egg.js+云Mongodb快速入门

目录 下载项目模版功能实现流程分析egg.js简介 egg.js 官网 初始化 云 mongodb 云 mongodb 开通 本地 mongodb 安装 mongodb 使用方法 通过 egg.js 框架添加新的API 云 mongodb 开通 本地 mongodb 调试技巧讲解 egg.js 接入 mongodb 方法 云 mongodb 如何连接公网…

mysql深分页

第一种&#xff1a;主键自增id情况&#xff1a; 未改&#xff1a; select * from wx_product_category_info where category_name_cn#{categoryNameCn} and category_type#{categoryType} order by id asclimit #{pageNum}, #{pageSize};在普通的limit条件下&#xff0c;如果…

如何通过appuploader把ipa文件上传到App Store教程步骤

​ iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store&#xff01;​ 下面进行步骤介绍&#xff01;​ 利用Appuploader这个软件&#xff0c;可以在Windows、Linux或Mac系统中申请ios和上传IPA到App Store Connect。​ 非常的方便&#xff0c;没有Mac也可以…

回炉重造十三----Docker的运用

1、Docker和虚拟机的区别 两者的区别 虚拟化环境下每个 VM 是一台完整的计算机&#xff0c;在虚拟化硬件之上运行所有组件&#xff0c;包括其自己的操作系统。 容器之间可以共享操作系统,比起 VM 被认为是更轻量级.且与 VM 类似&#xff0c;每个容器都具有自己的文件系统、CPU…

42电机插座接线可以用PH2.0冷压端子

文章目录 42电机插座接线可以用PH2.0冷压端子概述笔记备注END 42电机插座接线可以用PH2.0冷压端子 概述 设备上的42电机在我不断调整电机安装位置时, 接线从插孔中折断了. 问厂家, 他们的线也是定制的. 另外, 他是销售, 不清楚具体插座的型号和插座要用的冷压端子是哪种. 因为…

Java 关键字之:package与import

一、package 关键字 为了更好的实现项目中类的管理&#xff0c;提供包的概念使用package声明类或者接口所属的包&#xff0c;声明在源文件的首行包&#xff0c;属于标识符&#xff0c;遵循标识符的命名规则、规范(xxxyyyzzz)、"见名知意"每“.”一次&#xff0c;就代…

windows 下安装Docker (WSL2)

测试环境&#xff1a; VMware Workstation 17 WinServer2022 docker 4.19 python3.8 第一步&#xff1a;环境准备&#xff1a; 1.开启虚拟化 2. 开启WSL、容器功能 重启服务器 第二步&#xff1a; 安装docker 桌面版&#xff1a;Get Docker | Docker Documentation 此时启动会…

Django框架之错误视图和HTTP方法装饰器

本篇主要记录如何定义视图&#xff0c;错误视图有哪些并如何实现自定义&#xff0c; HTTP方法装饰器定义及实现&#xff0c;还有csrf中间件设置位置及关闭。 定义视图 一般在views.py文件下定义 视图参数&#xff1a; 错误视图 400视图 当出现SuspiciousOperation异常并且代…

Linux Kernel内核整体架构(图文详解)

1&#xff0c;前言 本文是“Linux内核分析”系列文章的第一篇&#xff0c;会以内核的核心功能为出发点&#xff0c;描述Linux内核的整体架构&#xff0c;以及架构之下主要的软件子系统。之后&#xff0c;会介绍Linux内核源文件的目录结构&#xff0c;并和各个软件子系统对应。…