【蓝桥杯】算法提高 字符串匹配

问题描述
  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <string.h>
 4 #include <iostream>
 5 #define MOD 1000000007
 6 #define MAX_COL 9
 7 using namespace std;
 8 int next[101];
 9 void get(string s){
10     next[0] = -1;
11     int i=0,j=-1;
12     while(i<s.length()){
13         if(j<0||s[i]==s[j]){
14             i++;
15             j++;
16             next[i]=j;
17         }else{
18             j = next[j];
19         }
20     }
21 }
22 
23 int kmp(string p,string s)//p是模板串,s是子串
24 {
25     get(s);
26     int i=0,j=0;
27     int n=p.length();
28     int m=s.length();
29     while(i<n&&j<m)
30     {
31         if(j==-1||p[i]==s[j])
32         {
33             i++;
34             j++;
35         }
36         else
37             j=next[j];
38     }
39     if(j>=m)//s串比较完毕
40         return i-m+1;
41     else
42         return -1;
43 }
44 int main(){
45     //freopen("in.txt","r",stdin);
46     string s;
47     cin>>s;
48     int t ,n ;
49     cin>>t>>n;
50     if(t==1){
51         for(int tt= 0;tt<n;tt++){
52             string p;
53             cin>>p;
54             if(kmp(p,s)>=1)cout<<p<<endl;
55         }
56     }else{
57         for(int tt= 0;tt<n;tt++){
58             string p;
59             cin>>p;
60             string p1 = p;
61             for(int ij = 0 ;ij<s.length();ij++){
62                 if(s[ij]>='a'&&s[ij]<='z'){
63                     s[ij] = s[ij] -'a'+'A';
64                 }
65             } 
66             for(int ij = 0 ;ij<p1.length();ij++){
67                 if(p1[ij]>='a'&&p1[ij]<='z'){
68                     p1[ij] = p1[ij] -'a'+'A';
69                 }
70             } 
71             if(kmp(p1,s)>=1)cout<<p<<endl;
72         }
73     }
74     
75     return 0;
76 }

 

posted @ 2020-05-13 12:58  清谗  阅读(217)  评论(0编辑  收藏  举报