试题编号:201409-3
试题名称:字符串匹配时间限制: 1.0s内存限制: 256.0MB 问题描述
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
输入的第一行包含一个字符串S,由大小写英文字母组成。 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。 第三行包含一个整数n,表示给出的文字的行数。 接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello
样例输出
HelloWorld HiHiHelloHiHi HELLOisNOTHello
样例说明
在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
1<=n<=100,每个字符串的长度不超过100。
解题思路:
实现代码(java):
1 package ccf_test2014_09; 2 3 import java.util.Scanner; 4 public class StringPiPei { 5 6 public static void main(String[] args) { 7 8 Scanner input = new Scanner(System.in); 9 10 String s = input.nextLine().trim();11 12 boolean flag = (input.nextInt()==1);13 14 input.nextLine();15 16 int num = input.nextInt();17 18 String [] strings = new String[num];19 20 String [] outStrings = new String[num];21 22 int total = 0;23 24 input.nextLine();25 26 for(int i = 0; i < num; i++){27 28 strings[i] = input.nextLine().trim(); 29 30 }31 32 for(int i = 0; i < num; i++){33 34 int length = strings[i].length();35 36 for(int j = 0; length-j>=s.length();j++){37 38 String newString = strings[i].substring(j, j+s.length());39 40 if(flag && newString.equals(s)){ 41 42 outStrings[total++] = strings[i];43 44 break;45 46 } 47 if(!flag && newString.compareToIgnoreCase(s)== 0){48 49 outStrings[total++] = strings[i];50 51 break; 52 }53 }54 55 }56 for(int i = 0; i < total; i++){57 58 System.out.println(outStrings[i]);59 }60 61 }62 63 }
运行结果:
实现代码2(java)
1 import java.util.Scanner; 2 import java.util.regex.Matcher; 3 import java.util.regex.Pattern; 4 5 public class Main { 6 public static void main(String[] args) { 7 Scanner sc=new Scanner(System.in); 8 String str=sc.next(); 9 int flag=sc.nextInt();10 int n=sc.nextInt();11 String[] array=new String[n];12 for (int i = 0; i < n; i++) {13 array[i]=sc.next();14 }15 for (int i = 0; i < n; i++) {16 Pattern p;17 if (flag==0) {18 p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);19 }else{20 p=Pattern.compile(str);21 }22 23 Matcher m=p.matcher(array[i]);24 if (m.find()) {25 System.out.println(array[i]);26 }27 }28 29 }30 31 }
运行结果:
实现代码(c++):
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 string s1,s2;11 int n;12 void solve(string &s)13 {14 int l=s.size();15 for(int i=0;i ='A'&&s[i]<='Z') s[i]=s[i]-'A'+'a';18 }19 }20 int main()21 {22 // freopen("in.txt","r",stdin);23 int flag;24 while(cin>>s1){25 scanf("%d",&flag);26 if(flag){27 scanf("%d",&n);28 for(int i=0;i >s2;31 if(s2.find(s1)!= s2.npos) cout< < >s2;40 string s3=s2;41 solve(s2);42 43 if(s2.find(s1) != s2.npos) cout< <
运行结果: