洛谷P1308.统计单词数(字符串匹配)
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式
共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数−1。
输入输出样例
输入 #1
To
to be or not to be is a question
输出 #1
2 0
输入 #2
to
Did the Ottoman Empire lose its power at that time
输出 #2
-1
我的分析
乍一看,该题目比传统字符串模式匹配简单。因为单词已经用空格分开,一个单词初始部分匹配不成功就不需要看该单词剩余部分了,直接跳到下一个单词即可。算法中更不存在传统模式匹配中游标i在匹配不成功后还要退回去重新匹配的尴尬处境,全程遍历游标i只需要向右移动而无须回退。我们最终可以轻易地写出时间复杂度为O(n)的算法,n为英文文章的长度。
然而,第一次提交代码时我居然有部分case没有过!诶?

我眉头微微一皱,发现想要写出对所有case都AC的健壮代码,事情并没有那么简单。。。╮(╯◇╰)╭
如何读取带有空格的字符串?是否可考虑了边界问题?比如处理最后一个单词时数组下标会不会越界?是否周全考虑了模式串长于或短于某单词的情况?是否全面考虑了模式串出现在某单词开头,中间,末尾的情况,以保证你的算法不会出现错判?以上个个都是坑,稍不注意就会掉进坑里,更恐怖的掉进坑里了你还浑然不觉。
说实话,这道题的算法我修修补补,各种断点调试了半天,始终有问题。最后我采取了一个小技巧,就是在原来的单词文章后面再加一个空格,这对于后面防止数组越界和简化一些条件判断都非常有帮助,大大简化了代码。
我最终提交并AC的代码如下:
#include<iostream>
using namespace std;
int main(){
string p;
string s;
getline(cin,p); //读取一行字符串(包括空格)
getline(cin,s);
int pos=-1;
int count=0;
s +=' ';
for(int i=0;i<s.length();++i){
//单词和模式串的首字母相同(不分大小写)即开始匹配
if(s[i]==p[0]||abs(s[i]-p[0])==32){
int tmp=i; //记录开始匹配时i的位置
bool flag=1;//标志flag为表示匹配是否成功
for(int j=1;j<p.length();++j){
i++;
if(s[i]!=p[j]&&abs(s[i]-p[j])!=32){
flag=0;
break;
}
}
//就算全部匹配,还必须保证除了模式串,
//单词后面是空格而非其他字母,否则不匹配
if(flag==1){
if(s[i+1]!=' '){
flag=0;
}
}
//满足匹配要求,计数加一
//若是第一次匹配成功,记录本次开始匹配的位置
if(flag){
count++;
if(pos==-1) pos=tmp;
}
//跳到下一个单词,保证不在本单词继续匹配了
while(s[i]!=' ') i++;
}
//否则,直接跳到下一个单词
else{
while(s[i]!=' ') i++;
}
}
if(count==0) cout<<"-1"<<endl;
if(count>0) cout<<count<<" "<<pos<<endl;
return 0;
}
洛谷P1308.统计单词数(字符串匹配)的更多相关文章
- 洛谷 P1308 统计单词数【字符串+模拟】
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 洛谷 P1308 统计单词数【字符串处理】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 洛谷 P1308 统计单词数
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 洛谷 P1026 统计单词个数
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- 【洛谷】P1308 统计单词数-全AC题解(易理解
弟弟的混乱代码(易理解 大概 思路: 循环b(被找的字符串),遇空格比较两空格间的长度是否与a(需要查找的字符)相等:不相等继续循环:相等比较内容是否相同(倒数比较,不一样直接退出 ,直到比较到第一个 ...
- 洛谷 P1026 统计单词个数 Label:dp
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- [NOIP2001] 提高组 洛谷P1026 统计单词个数
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保 证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的 ...
- 洛谷P1026 统计单词个数【区间dp】
题目:https://www.luogu.org/problemnew/show/P1026 题意: 给定一个字符串,要求把他分成k段.给定s个单词,问划分成k段之后每段中包含的单词和最大是多少. 一 ...
- 洛谷 P1308 统计单词数【string类及其函数应用/STL】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
随机推荐
- layui :iframe 与 layer 的位置问题
最近有个项目是用 Layui 搭的,但是在layer的使用上遇到了问题. 简单的说,在父页面声明layer,在子页面中的子页面用window.parent调用那个父页面的layer. 讲道理应该是和i ...
- 不是吧,阿sir,2020年程序员要不好过?
自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员… ...
- 字符编码笔记:ASCII,Unicode 和 UTF-8个人理解
一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位(字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作 ...
- 华东师范大学p163页,用闭区间套定理证明数列的可惜收敛准则,被网友解决了。
- 02_HTML03
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"软件测试"获取视频和教程资料! b站在线视频 HTML ...
- PHP each() 函数
实例 返回当前元素的键名和键值,并将内部指针向后移动: <?php $people = array("Peter", "Joe", "Glenn ...
- PHP date_timezone_set() 函数
------------恢复内容开始------------ 实例 设置 DateTime 对象的时区: <?php$date=date_create("2013-05-25" ...
- PHP is_writable() 函数
定义和用法 is_writable() 函数检查指定的文件是否可写. 如果文件可写,该函数返回 TRUE. 语法 is_writable(file) 参数 描述 file 必需.规定要检查的文件. 提 ...
- PAM学习笔记
想了想 还是要先把字符串的东西先都学完告一段落了再说 时间不多了 加油~. PAM 回文自动机 比SAM简单到不知道哪里去了. 回文自动机和其他自动机一样有字符集 有状态 有转移. 一个字符串的回文自 ...
- luogu P4884 多少个1?
LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...