当前位置: 首页 > news >正文

【记忆回溯】【深度搜索】【动态规划】【字符串】【力扣】单词拆分

目录

题目描述

解题思路

解答(c语言)


题目描述

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

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

示例 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

解题思路

解题思路:深度遍历的思想

从字符串的起始位置开始匹配字典中的单词,如果能匹配到,则继续从字符串中该单词后面继续匹配字典中的单词,直到完全匹配。

  • 比如s = "catsandog",wordDict = {"cats","dog","sand","and","cat"}
  • index = 0时,对"catsandog"进行前缀匹配,可以匹配到"cats",也可以匹配到"cat"等,则需要记忆回溯,也就是深度遍历,先匹配到"cats"处理,然后更新index = 4
  • index = 4时,对"andog"进行前缀匹配,匹配到"and",然后更新index = 7
  • index = 7时,对"og"进行前缀匹配,没有一个能匹配,然后返回到index = 4时,寻找能否有匹配的单词,已经匹配过的不再匹配,比如"and"
    • 如果index = 4时没有可匹配的,返回index = 0时的前缀匹配,寻找能否有匹配的单词
    • 如果index = 4时有可匹配的,则继续向下匹配,像刚才那样
  • 就这样,来来回回寻找(深度遍历),直到index = strlen(s),说明可以s能被wordDict拼接。如果index从0到1,到2,到strlen(s) - 1对字典所有匹配都尝试完了,仍然没有则说明不能被拼接

注意点:已经匹配过的不再匹配,提交后才发现,否则会超时,因为会有很多重复判断

解答(c语言)

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>int isMatch = 0;  // 标记能否被分割int Forward(int index, char* s, size_t sLen, char **wordDict, int wordDictSize, int *isHasJudge)
{// 一旦有拼接成功的方案,则不再找寻其它方案if (isMatch == 1) {return 1;}// 恰好拼接成功if (index == sLen) {isMatch = 1;return 1;}// 无法拼接成功if (index > sLen) {return -1;}// 判断过的不再判断if (isHasJudge[index] == 1) {return -1;}// 遍历全部单词判断for (int j = 0; j < wordDictSize; j++) {size_t len = strlen(wordDict[j]);if (strncmp(s + index, wordDict[j], len) == 0) {int ret = Forward(index + len, s, sLen, wordDict, wordDictSize, isHasJudge);if (ret == 1) {return 1;}}}// 已判断过的做好标记isHasJudge[index] = 1;// 如果没有一个单词能匹配,则返回负数return -1;
}bool wordBreak(char* s, char **wordDict, int wordDictSize) 
{// 每个用例会更改全局变量,需要重新初始化isMatch = 0;  size_t sLen = strlen(s);// 记录每个下标(0,1,2,..., sLen-1)是否已经和所有子串匹配过int isHasJudge[sLen]; memset(isHasJudge, 0, sizeof(isHasJudge));// 深度遍历寻找所有方案Forward(0, s, sLen, wordDict, wordDictSize, isHasJudge);return isMatch == 1;
}int main() 
{int select = 3;if (select == 1) {char *s = "catsandog";char *wordDict[] = {"cats","dog","sand","and","cat"};wordBreak(s, wordDict, 5);} else if  (select == 2) {char *s = "applepenapple";char *wordDict[] = {"apple","pen"};wordBreak(s, wordDict, 2);} else if (select == 3) {char *s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";char *wordDict[] = {"a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"};wordBreak(s, wordDict, 10);}return 0;
}


end

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pandas操作Excel文件
  • react vant 在使用dialog.confirm取消报错 Uncaught (in promise) undefined
  • jQuery入门(七)jQuery实现按钮分页
  • 关于VUE3开发频繁引入ref,reactive,computed等基础函数。
  • c++ 标准模板库 STL
  • 运维问题0001:MM模块-MIGO收货报错“消息号 M7036 对于采购订单********无收货可能”
  • 【MySql】在Redis使用中,缓存不一致的夺命十八问!
  • 系统监控和命令行环境
  • 会赢的!(牛客)
  • python进阶篇-day04-闭包与装饰器
  • Springboot快速创建的两种方法(简单易学)
  • UE5 UMG UI编辑器工作流
  • HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容
  • C语言学习笔记 Day15(文件管理--下)
  • 多态,匿名内部类(lambda表达式),集合
  • 分享一款快速APP功能测试工具
  • CentOS7 安装JDK
  • DataBase in Android
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java基本数据类型之Number
  • js中forEach回调同异步问题
  • node 版本过低
  • php面试题 汇集2
  • Spring Cloud中负载均衡器概览
  • spring-boot List转Page
  • supervisor 永不挂掉的进程 安装以及使用
  • 从零开始在ubuntu上搭建node开发环境
  • 分布式任务队列Celery
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用parted解决大于2T的磁盘分区
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 我与Jetbrains的这些年
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 《码出高效》学习笔记与书中错误记录
  • 阿里云API、SDK和CLI应用实践方案
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 交换综合实验一
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • ## 基础知识
  • #预处理和函数的对比以及条件编译
  • (Java)【深基9.例1】选举学生会
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)图像的%2线性拉伸
  • (算法)区间调度问题
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (状压dp)uva 10817 Headmaster's Headache
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net Stream篇(六)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET简谈设计模式之(单件模式)
  • .NET轻量级ORM组件Dapper葵花宝典