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

第五题:分词

题目描述

给定一个包含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 1000

int 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.mfbz.cn/a/214179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv7算法的的高精度实时通用目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时检测识别系统可用于日常生活中检测与定位多种目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数据集…

Python继承的设计及演化

Python中的继承 文章目录 Python中的继承概念明确MRO深度优先算法&#xff08;Python2.2之前及Python2.2的经典类中使用&#xff09;优化版的深度优先算法&#xff08;只在Python2.2版本的新式类中使用&#xff09;广度优先算法&#xff08;Python任何版本都从未使用过&#xf…

Difference between getc(), getchar(), and gets()

getc(): 从输入中只能读单个字符 getchar()&#xff1a;从标准输入流中输入都单个字符。 两者基本等同&#xff0c;唯一不一样的是getc()是任何输入流&#xff0c;而getchar()是标准输入流。 gets:可以读入含有空格的字符串 // Example for getc() in C #include <stdio.h…

【数电笔记】06-码制

目录 说明&#xff1a; 二进制代码 1. 二 - 十进制码 2. 常用二 - 十进制代码表 2.1 例题 可靠性代码 1. 格雷码 2. 奇偶校验码 3. 8421奇偶校验码表 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并未记录所有章节&#xff0c;只对个人认…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

UCore-OS实验Lab0

实验内容&#xff1a;搭建ucore-os的实验环境 实验准备内容&#xff1a;vmware虚拟机&#xff0c;ubuntu22.04镜像&#xff0c;qemu7.0.0源码 ucore代码地址 GitHub - chyyuu/os_kernel_lab at x86-32 实验步骤&#xff1a; 在vmware中安装ubuntu&#xff0c;因为我个人喜欢…

智能优化算法应用:基于蝠鲼觅食算法无线传感器网络(WSN)覆盖优化 - 附代码

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

Linux系统中进程间通信(Inter-Process Communication, IPC)

文章目录 进程间通信介绍进程间通信目的进程间通信发展 管道什么是管道 匿名管道用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则管道特点 命名管道创建一个命名管道匿名管道与命名管道的区别命名管道的打开规则 命名管道的删除用命名管…

Python标准库:math模块【侯小啾python领航班系列(十六)】

Python标准库:math模块【侯小啾python领航班系列(十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

ebpf简述

0 什么是ebpf&#xff1f; Ebpf可以简单的理解成在linux内核&#xff08;当然windows也已经支持&#xff09;里添加了一个虚拟机&#xff0c;开发者编写的代码可以安全地在内核虚拟机中运行&#xff0c;这样可以更高效地、安全地实现内核级程序的编写&#xff0c;ebpf 的map机…

什么是负载均衡?

什么是负载均衡&#xff1f; 最近有小伙伴想让我聊一聊负载均衡方面的问题&#xff0c;我说&#xff0c;网上有这么多资料了&#xff0c;怎么还需要我来分享&#xff0c;他说网上的很多资料不系统&#xff0c;难理解。 关于负载均衡&#xff0c;我会从四个方面去说。 负载均衡…

Java+springboot+avue医院绩效考核系统源码支持二次开发

公立医院改革要求建立公立医疗卫生机构绩效考核体系&#xff0c;借助绩效考核来引导各级公立医院把社会效益摆在首位&#xff0c;提高医疗服务质量&#xff0c;规范医疗服务行为&#xff0c;加强医院内部管理&#xff0c;促进医院高质量发展 医院绩效考核系统&#xff0c;建立以…

【异常】捕获线程池执行任务时产生的异常

前言&#xff1a; 在编写程序时&#xff0c;我们为了充分利用多核CPU、加快接口响应速度&#xff0c;通常会使用线程池来处理请求&#xff0c;但线程池执行任务过程中难免会出现异常&#xff0c;导致请求失败。那如果我们想在任务发生异常后捕获异常&#xff0c;并做一些”善后…

Go连接mysql数据库

package main import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" ) //go连接数据库示例 func main() {// 数据库信息dsn : "root:roottcp(192.168.169.11:3306)/sql_test"//连接数据库 数据库类型mysql,以及数据库信息d…

Selenium自动化测试:通过cookie绕过验证码的操作

验证码的处理 对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 ​解决验证码的方法如下&#xff1a; 1、开发做个万…

机器学习---pySpark代码开发

1、eclipse开发pySpark程序 在eclipse中开发pySpark程序&#xff0c;需要安装pydev插件。 1).eclipse安装python插件,安装完成后重启。 2). 在window--->preferences中找到python interpreter配置安装python的路径&#xff1a; 3).新建python项目&#xff1a; 2、pyCharm开…

基于Java SSM框架+Vue实现旅游资源网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现旅游资源网站演示 摘要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述旅游…

kgma转换flac格式、酷狗下载转换车载模式能听。

帮朋友下载几首歌到U盘里、发现kgma格式不能识别出来&#xff0c;这是酷狗加密过的格式&#xff0c;汽车不识别&#xff0c;需要转换成mp3或者flac格式&#xff0c;网上的一些辣鸡软件各种收费、限制、广告&#xff0c;后来发现一个宝藏网站&#xff0c;可以在线免费转换成flac…

前端组件库开发

通常我们会使用很多组件库&#xff0c;有时候我们会去看源码比如element&#xff0c;antd&#xff0c;然后发现多少是按需导出&#xff0c;和vue.use全局注册&#xff0c;依赖于框架的拓展。 组件库的开发依赖框架的版本和node的版本&#xff0c;这个是需要说明的&#xff0c;然…

充电桩新老国标兼容性分析

1、背景介绍 1.1、充电桩相关标准发展历程 1.2、兼容性分析历史 1.3、兼容性分析的目的 1.4、兼容性分析的内容 2、B类协议兼容性分析 2.1、协议分层结构 2.2、链路层分析 2.3、版本协商与链路检测 ## 2.4、传输层分析 2.5、应用层 2.5.1、应用层数据 2.5.2、应用层数据…