CCF CSP 201409-3.字符串匹配

问题描述

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

输入格式

  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

输出格式

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

样例输入

Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

样例输出

HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

样例说明

  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。

评测用例规模与约定

  1<=n<=100,每个字符串的长度不超过100。


分析:

这是一道简单的字符串模拟题。

当大小写敏感时,本题变为判断字符串是否包含某一子串;

当大小写不敏感时,可以先将字符串和子串都转换为小写(或者大写)形式,接下来的操作,与大小写敏感时一致。

在C/C++中,判断字符串是否包含某一子串,可以使用strstr()或者字符串的find();在Java中,可以使用字符串的contains()

  • C++版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <cstdio>
#include <cstring>

// 将source转换为小写字符串result
void to_lower_case(char source[], char result[]) {
int size = strlen(source);
for (int i = 0; i < size; i++) {
if ('A' <= source[i] && source[i] <= 'Z') {
result[i] = source[i] + 32;
} else {
result[i] = source[i];
}
}
result[size] = '\0';
}

int main() {
char pattern[101], str[101];
scanf("%s", pattern);

int ignore, n;
scanf("%d %d", &ignore, &n);

char * position;
char pattern2[101], str2[101];
for (int i = 0; i < n; i++) {
scanf("%s", str);
if (ignore == 0) {
to_lower_case(pattern, pattern2);
to_lower_case(str, str2);
position = strstr(str2, pattern2);
} else {
position = strstr(str, pattern);
}

if (position != NULL) {
printf("%s\n", str);
}
}
return 0;
}
  • Java版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
// 1.输入
Scanner scan = new Scanner(System.in);
String pattern = scan.nextLine();
boolean ignoreCase =
Integer.parseInt(scan.nextLine().trim()) == 0 ? true : false;
int line = Integer.parseInt(scan.nextLine().trim());

// 2.处理并输出
StringBuilder sb = new StringBuilder();
for (int i = 0; i < line; i++) {
String str = scan.nextLine();
if ((ignoreCase && str.toLowerCase().contains(pattern.toLowerCase()))
|| (!ignoreCase && str.contains(pattern))) {
sb.append(str).append("\n");
}
}
scan.close();

System.out.println(sb.toString());
}
}

----------本文结束感谢您的阅读----------
坚持原创技术分享,您的支持将鼓励我继续创作!