字符串匹配

问题描述
  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例说明
  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
  1<=n<=100,每个字符串的长度不超过100。
代码展示
/* 字符串匹配 */ /* 这个题目对时间要求不高 */ #include<iostream> #include<cstring> using namespace std; /* 写一个函数判断两个字符串是否匹配,之后一个一个比较即可 */ //判断第二个字符串是否包含第一个 bool ismatch(string s1, string s2) { int n1 = s1.length(); int n2 = s2.length(); if (n1 > n2) return false; int a =0,b = 0; while (b < n2) { if (s1[a] == s2[b]) { a++; b++; } else { if (a == 0) b++; else a = 0; } if (a == n1) return true; } return false; } int main() { string s; cin >> s; int sense; cin >> sense; int n; cin >> n; string* strs = new string[n]; for (int i = 0; i < n; i++) { cin >> strs[i]; } if (sense) { for (int i = 0; i < n; i++) { if (ismatch(s, strs[i])) cout << strs[i] << endl; } } else { //先对字符串进行处理 for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] + 'a' - 'A'; } for (int i = 0; i < n; i++) { string tmp = strs[i]; for (int j = 0; j < tmp.length(); j++) { if (tmp[j] >= 'A' && tmp[j] <= 'Z') tmp[j] = tmp[j] + 'a' - 'A'; } if (ismatch(s, tmp)) cout << strs[i] << endl; } } system("pause"); return 0; }

本题的关键点在于当第一个字符串的下标为0仍与字符2不匹配时,要令字符2下标右移;

但是字符1的下标不为0时的不匹配,要把字符1的下标置为0

 


__EOF__

本文作者不太聪明的小高
本文链接https://www.cnblogs.com/daviselppa/p/16527418.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   不太聪明的小高  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示