在另一篇文章XDOJ.T204_单词统计(超强算法)中介绍了有穷自动机的基本用法后,再来灵活运用一下。比如这一道题。

标题

字符串查找

类别

字符串处理

时间限制

2S

内存限制

256Kb

问题描述

给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明

输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。(并没有指定n的取值范围,只好假设n<=100,还好能得满分)
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
每个字符串长度不超过100。

输出说明

输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。

输入样例

Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

输出样例

HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

对于这一题而言,只有两种状态
  • 不是要查找的单词的对应字母(LETTER)
  • 当前字母正是要查找的单词的对应字母,而且第n个字母的状态就用n表示(WORD,。。。)
#include <stdio.h>
#include <string.h>#define WORD 1
#define LETTER -1int main()
{char word[101];gets(word);int sensi; //sensitivity(敏感),这正是此题的特殊之处之一int n;scanf("%d%d",&sensi,&n);getchar();if(!sensi)strupr(word); //若sensi等于0,则大小写不敏感,把字符数组word中的字符全部转变为大写char str[101][101],str1[101];   /*字符数组str1的存在是为了保证字符数组str的内容不变因为最后输出的必须是原字符串*/int i=0,j;for(;i<n;++i){gets(str[i]);}int state=LETTER;int len=strlen(word);for(i=0;i<n;++i){strcpy(str1,str[i]);if(!sensi){strupr(str1);   //如果大小写不敏感,那么这样做能避免改变字符数组str的内容}int done=0; /*这也是此题的特殊之处之一,不需要统计单词出现了多少次,只需要根据情况输出这一行字符串,done用于判断这一行字符串是否已经被输出*/for(j=0;str1[j];++j){//            printf("J:%d STATE:%d\n",j,state);switch(state){case(LETTER):if(str1[j]==word[0])state=WORD;break;default:if(state<len){if(str1[j]==word[state])++state;else{j-=state;   /*这也是此题的特殊之处之一对于某些特殊样例,必须这样做*/state=LETTER;   //状态不要忘记改变}}else if(state==len){printf("%s\n",str[i]);  //如果大小写不敏感,那么字符数组str1中的字母全为大写,因此应该输出str[i]done=1; state=LETTER;}}if(done)break;  //如果这一行字符串是否已经被输出,那么done等于1,break,不需要再管剩下的字符}if(state==len&&!done)   //如果这一行字符串是否已经被输出,那么done等于1,不需要再输出{printf("%s\n",str[i]);state=LETTER;}}return 0;
}
除了状态只有两种以外,本题还有很多特殊之处:
  • 程序还需要支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。为了保证输出结果的正确,另定义了字符数组str1
  • 需要输入的字符串有多行,因此定义了一个二维字符数组str
  • 需要输出的不是单词出现的次数,而是含有被查找单词的字符串,变量done可以避免在某些情况下的重复输出
  • 至于j-=state,对于某些特殊情况必须这样做。比如这样的输入样例:

HeHeh
1
1
HeHeHeheH

如果不加上“j-=state;”这条语句,当程序检查到“HeHeHeheH”中的第三个‘H’时state变为LETTER,下一个循环之前j自增1,然后程序开始检查第三个‘e’,最后你会发现没有输出。
当然了,这题很可能有更简单的算法甚至思路。如果大佬们有,鄙人定当洗耳恭听。

XDOJ.T81_字符串查找相关推荐

  1. cmd html 查找汉子字,字符串查找 cmd find命令

    字符串查找 cmd find命令 2009-07-05 14:33:02 作者: 当我要查找字符串的时候,第一个想到的命令,并不是我在本文中要讲解的find,而是比它更强悍的命令findstr. 我对 ...

  2. python3 字符串查找 效率比较

    Python中字符串查找方式有多种,常见的有re.match/search or str.find 用一个例子来说明各种方式的效率如下: from timeit import timeit impor ...

  3. python字符串find函数-python字符串查找函数的用法详解

    python字符串查找函数的使用 打开Python开发工具IDLE,新建"findstr.py'文件,并写代码如下: s ='/ab/bx,.s' print (s.find('/x')) ...

  4. 【字符串】字符串查找 ( Rabin-Karp 算法 )

    文章目录 一.字符串查找 二.Rabin-Karp 算法 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字 ...

  5. 【字符串】字符串查找 ( 蛮力算法 )

    文章目录 一.字符串查找 二.蛮力算法代码示例 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字符串 第一 ...

  6. 查找字符位置_学习VB编程第69天 字符串查找与替换

    今天学习了VB提升教程4期,学习的主要内容是字符串查找与替换.零基础学VB课程已经结束,但是感觉还是没有太大进步,而且目前也没有确定后续该学什么语言,干脆就继续再学一段时间VB吧反正计划的三个月时间还 ...

  7. KMP 算法并非字符串查找的优化 [转]

    算法书和数据结构书对 KMP算法多有介绍,称只需对字符串扫描一遍不需回溯云云 .然而 ,它恐怕只应该作为一种思想存在 ;用于实际的字符串查找并不理想 .要费劲心血实现和优化它 ,才能在特定的字符串上略 ...

  8. 1.14 字符串查找(3种方法)indexOf(), lastlndexOf(), charAt()

    在给定的字符串中查找字符或字符串是比较常见的操作.字符串查找分为两种形式:一种是在字符串中获取匹配字符(串)的索引值,另一种是在字符串中获取指定索引位置的字符. 根据字符查找 String 类的 in ...

  9. vb 字符串替换_学习VB编程第69天 字符串查找与替换

    今天学习了VB提升教程4期,学习的主要内容是字符串查找与替换.零基础学VB课程已经结束,但是感觉还是没有太大进步,而且目前也没有确定后续该学什么语言,干脆就继续再学一段时间VB吧反正计划的三个月时间还 ...

最新文章

  1. Mac~终端安装Homebrew packages超时
  2. wxWidgets:wxFileDialog类用法
  3. 八、探索性数据分析——数字化探索
  4. 5 Java 插入排序
  5. Python制作回合制手游外挂简单教程(下)
  6. 如果你是IT技术人员,请思考这15个问题
  7. 关于DataAdapter打开和关闭连接
  8. python中while的用法_Python—while循环,内涵五种九九乘法表
  9. RabbitMQ的入门程序test测试代码
  10. 3. JavaScript Date 对象
  11. Qt_解决Qt5.15 + Xcode12iOS端qmake不可用的问题
  12. SwiftyJSON的使用详解
  13. FDDB数据集标注文件:椭圆转换矩形
  14. mcafee升级包下载地址
  15. ENVI中对图像监督分类结果的编辑
  16. Gamma 分布函数可加性证明
  17. Gateway路由谓词工厂实例
  18. 如何制作VR全景图片全景图片制作教程
  19. 苏宁易购不易购,遭遇临时涨价、一月未送货
  20. 第二集 第一魂环 第九章

热门文章

  1. 283-Go语言的变量
  2. 华为java模拟器下载手机版,华为ism模拟器|华为存储ISM模拟器下载 V100R005
  3. 关于问题【无法启动 IIS Express Web 服务器。另一个程序正在使用此文件,进程无法访问。 (0x80070020)】
  4. VBA使用Outlook自动发送邮件
  5. SSE Instructions
  6. su 命令和sudo命令的区别
  7. Linux缓存之TLB
  8. unity学习笔记-精灵集和精灵动画
  9. C++(PTA)——多边形的周长计算(继承)
  10. 手把手教你怎么撩妹,五分钟读懂!提取于《谈话的力量》