[动态规划,字符串操作] 分词

第五题:分词

题目描述

给定一个包含n个单词的英文词典和m个只由英文字母组成的字符串。
判断这些字符串能否由词典中的单词组成。
比如词典中包含5个单词:“Jim”, “and”, “cat”,“like”, “dog”
这些单词能组成"Jimlikecatanddog"、“doglikecatandcatlikedog"等,
但是不能组成"catlikeme”
为了简化问题,所有的字母都是小写,而且词典中的所有单词长度都一样。

关于输入

第一行两个正整数,n和m(n,m都不超过100);
接下来n行,每行一个单词,每个单词长度不超过20;
接下来m行,每行一个字符串,长度不超过1000;

关于输出

m行,表示词库中的单词能否组成该字符串,能输出"Yes",不能输出"No"。

例子输入

10 5
did
not
and
but
hit
run
cat
dog
pig
cow
cathitdoganddogrun
doghitpigbutpigdidnotrun
pighitcowandcowdidrun
cowhitcatandcatcry
catdogpigandcowarehungry

例子输出

Yes
Yes
Yes
No
No

解题分析

要解决这个问题,我们可以使用一种称为“动态规划”的方法。这种方法的核心是从字符串的开头开始,逐步检查每个可能的词典单词,看它是否出现在当前位置。如果找到一个词典中的单词,我们就标记这个位置,然后从这个位置之后的字符串继续重复这个过程。如果能找到一种方式,使得整个字符串都被词典中的单词覆盖,那么答案就是"Yes",否则是"No"。

以下是使用C语言实现这个算法的步骤:

读取输入:首先,读取n和m的值,然后读取所有的词典单词和要检查的字符串。

初始化动态规划数组:创建一个布尔型数组 dp,其中 dp[i] 表示字符串的前 i 个字符能否被词典中的单词完全覆盖。初始化 dp[0] = true,因为空字符串总是可以被覆盖。

动态规划求解:对于每个字符串,从左到右遍历。对于每个位置 i,遍历词典中的所有单词。如果当前位置之前的字符串可以被覆盖(即 dp[i - wordLength] == true),并且从位置 i - wordLength 开始的子字符串是词典中的一个单词,那么将 dp[i] 设置为 true。

输出结果:如果 dp[strlen(str)] 是 true,则输出 “Yes”,否则输出 “No”。

代码实现

#include <stdio.h>
#include <string.h>
#include <stdbool.h>#define MAX_WORDS 100
#define MAX_WORD_LENGTH 20
#define MAX_STRING_LENGTH 1000int n, m;
char dictionary[MAX_WORDS][MAX_WORD_LENGTH + 1];
char str[MAX_STRING_LENGTH + 1];bool canFormString() {int len = strlen(str);bool dp[len + 1];memset(dp, false, sizeof(dp));dp[0] = true;for (int i = 0; i <= len; i++) {if (!dp[i]) continue;for (int j = 0; j < n; j++) {int wordLen = strlen(dictionary[j]);if (i + wordLen <= len && strncmp(&str[i], dictionary[j], wordLen) == 0) {dp[i + wordLen] = true;}}}return dp[len];
}int main() {scanf("%d %d", &n, &m);for (int i = 0; i < n; i++) {scanf("%s", dictionary[i]);}for (int i = 0; i < m; i++) {scanf("%s", str);if (canFormString()) {printf("Yes\n");} else {printf("No\n");}}return 0;
}

当然如果我们使用c++中string的find函数,本题显然可以不用动态规划:
(方法二)

#include <iostream>
using namespace std;int main() {int n,m; cin>>n>>m;getchar();string words[n];for(int i=0;i<n;i++){cin>>words[i];}for(int i=0;i<m;i++){string s; cin>>s;string temp(s.size(),' ');for(int i=0;i<n;i++){while(s.find(words[i])!=string::npos){int len=words[i].size();int p=s.find(words[i]);for(int j=p;j<p+len;j++){s[j]=' ';}}}if(s==temp){cout<<"Yes"<<endl;}else cout<<"No"<<endl;}return 0;
}
进一步拓展

strncmp 函数是 C 语言标准库中用于比较两个字符串的函数,它可以比较两个字符串的前 n 个字符。这个函数定义在 <string.h> 头文件中。它的原型如下:

int strncmp(const char *s1, const char *s2, size_t n);
  • s1:第一个字符串的指针。
  • s2:第二个字符串的指针。
  • n:要比较的最大字符数。

strncmp 函数的行为和特点包括:

  1. 比较字符:它从两个字符串的开始处开始比较,直到遇到不同的字符或比较了 n 个字符为止。

  2. 比较结果

    • 如果在比较了 n 个字符之前 s1s2 是相同的,函数返回 0。
    • 如果在比较了 n 个字符之前在 s1 中的字符小于 s2 中的相应字符(根据 ASCII 值),函数返回一个小于 0 的值。
    • 如果在比较了 n 个字符之前在 s1 中的字符大于 s2 中的相应字符,函数返回一个大于 0 的值。
  3. 字符串长度:如果两个字符串的前 n 个字符是相同的,但它们的长度不同,strncmp 只比较前 n 个字符,因此认为这两个字符串是相等的。

  4. 安全性strncmp 是比 strcmp 更安全的选择,因为它不会因为字符串未以空字符结尾而导致访问越界。

  5. 返回值:根据比较结果返回不同的整数值。

strncmp 函数常用于比较有长度限制的字符串或者在不确定字符串是否以空字符结尾的情况下进行安全的字符串比较。使用时需要确保比较的字符数 n 不超过两个字符串中任一个的长度。

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

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

相关文章

[开题报告]基于SpringBoot的抑郁症科普平台的设计与实现

1.研究背景 抑郁症是一种常见的精神障碍&#xff0c;严重影响了患者的生活质量和社会功能。随着社会的快速发展和生活压力的增加&#xff0c;抑郁症的发病率逐渐上升&#xff0c;成为全球范围内的健康问题。然而&#xff0c;对抑郁症的认知和理解仍存在许多误解和偏见&#xf…

[开题报告]基于SpringBoot的自闭症知识宣传平台的设计与实现

1.研究背景 自闭症是一种常见的儿童神经发育障碍&#xff0c;通常在儿童时期即可出现。自闭症患者在社交互动、语言沟通和行为模式方面存在显著的缺陷&#xff0c;对他们及其家庭来说可能造成长期的困扰和挑战。 然而&#xff0c;社会对自闭症的了解和认知仍然相对薄弱。这导…

智能优化算法应用:基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.模拟退火算法4.实验参数设定5.算法结果6.参考…

MySQL中,text,mediumtext, 和 longtext字符类型

需求 由于项目需要&#xff0c;需要在mysql数据库&#xff0c;储存长文本&#xff0c;长文本格式可能为markdown也可能为html。 思路 测试存入html时&#xff0c;字符类型为varcar 255。很明显字符长度达不到要求。数据库抛错&#xff0c;修改字符类型 解决方案 将原本的字…

五步搞好全媒体整合营销

如何做好全媒体整合营销呢&#xff1f;要做好全媒体整合营销&#xff0c;小马识途营销顾问认为需要注意以下几个步骤&#xff1a; 1、确定目标受众&#xff1a;首先需要确定目标受众&#xff0c;了解他们的需求、兴趣和消费习惯等信息&#xff0c;以便于精准定位和制定相应的营…

Python虚拟环境创建和使用

前言 Python 虚拟环境是一个独立的 Python 环境&#xff0c;你可以在其中安装和使用 Python 库&#xff0c;而不会影响系统的全局 Python 环境。这在你需要为不同的项目使用不同版本的库时非常有用 Python 3.3 以后的版本都内置了 venv 模块&#xff0c;用来创建和管理虚拟环境…

4_企业架构双点服务器HA

企业架构双点服务器HA 学习目标和内容 1、能够描述高可用HA的作用 2、能够理解VIP的切换 3、能够描述keepalived作用 4、能够理解主master和备backup服务器关系 5、能够实现主备服务器高可用配置 6、能够实现模拟业务宕机服务切换 一、背景描述及其方案设计 1、业务背景描述 时…

JavaSE学习路线及经验所谈

前言 一.学习框架二.学习经验 相信很多小白刚开始学习Java时&#xff0c;都是靠自己在网上搜集资料&#xff0c;并没有明确规划&#xff0c;不知道要学习什么内容&#xff0c;也不知道学习的重点是什么&#xff0c;那么这篇文章会给你一个大致的指引&#xff0c;当然也可以作为…

网络之路27:IRF设备堆叠

正文共&#xff1a;3210 字 34 图&#xff0c;预估阅读时间&#xff1a;5 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…

每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)

每日一题系列&#xff08;day 11&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

【BLE基础知识】--Slave latency设置流程及空中包解析

1、Slave latency基本概念 当BLE从设备对耗电量要求较高时&#xff0c;若需要节省耗电量&#xff0c;则可以通过设置Slave Latency参数来减少BLE从设备的耗电。 Slave Latency&#xff1a;允许Slave&#xff08;从设备&#xff09;在没有数据要发的情况下&#xff0c;跳过一定…

如何在线给官网搭建一个帮助文档?

在数字化时代&#xff0c;帮助文档已成为官网不可或缺的一部分。然而&#xff0c;传统的帮助文档往往只是简单地罗列问题和答案&#xff0c;缺乏互动性和用户体验。那么&#xff0c;如何在线给官网搭建一个富有创意且用户友好的帮助文档呢&#xff1f; | 一、打造沉浸式体验 传…

C/C++学生选课/排课系统[2023-12-3]

问题描述&#xff1a;根据我校自动化专业的部分必修及选修课信 息&#xff0c;设计一个学生选课/排课系统。 基本要求&#xff1a; 1、从文件读入课程信息&#xff1b; 2、从键盘输入拟添加的选修课信息&#xff1b; 3、删除已选的选修课(1门或多门) &#xff1b; 4、输出已…

手写实现一个动态代理框架

手写实现一个动态代理框架 什么是代理模式什么是动态代理动态代理中的编译、类加载与对象实例化手写实现一个动态代理框架实现细节DynamicProxyHandlerProxy生成代码写入代码到磁盘文件调用编译器进行编译调用类加载器进行类加载反射实例化删除前面生成的java文件和class文件 C…

Optional类使用总结

1.1、Optional类介绍 在我们平常开发过程中&#xff0c;如果程序逻辑考虑不全&#xff0c;就有可能导致空指针异常NullPointerException&#xff0c;也就是我们常说的NPE。 出现空指针异常的根本原因&#xff0c;就是我们在使用某个对象的时候&#xff0c;没有判断这个对象是…

全网关键词采集,免费关键词采集软件使用方法

网站的SEO优化已经成为企业提升在线可见性的不二选择。而关键词的选择和使用则是SEO优化的核心。本文将专心分享关键词采集的正确用法&#xff0c;助您在SEO的道路上掌握正确的方向。 关键词采集&#xff1a;SEO的基础 让我们明确关键词采集的重要性。在搜索引擎的世界里&…

Python生产者消费者模型

额滴名片儿 &#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01…

【tower-boot 系列】redis集成

redis 介绍 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。支持网络&#xff0c;提供字符串&#xff0c;哈希&#xff0c;列表&#xff0c;队列&#xff0c;集合结构直接存取&#xff0c;基于内存&…

leetcode:468. 验证IP地址

验证IP地址 中等 249 相关企业 给定一个字符串 queryIP。如果是有效的 IPv4 地址&#xff0c;返回 “IPv4” &#xff1b;如果是有效的 IPv6 地址&#xff0c;返回 “IPv6” &#xff1b;如果不是上述类型的 IP 地址&#xff0c;返回 “Neither” 。 有效的IPv4地址 是 “x1.x…

【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析