题目简介
有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连续的空格。
查找单词时,不区分大小写,但要求完全匹配,即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。
说明
算是比较恶心的字符串题了。输入数据保证用C++的string写会超时(雾),于是当作指针练习来写了。
不知道OJ编译器为什么不允许在getchar()后面加gets()。不过只要在scanf用一些小技巧就差不多能变成gets。
strlwr还需要自己写真麻烦
#include <stdio.h>
#include <string.h>
char *strlwr(char *s)
{
char *str;
str = s;
while(*str != '\0'){
if(*str >= 'A' && *str <= 'Z')
*str += 'a'-'A';
str++;
}
return s;
}
int main(void)
{
int cas, t;
scanf("%d", &cas);
for (t = 0; t < cas; ++t){
char w[11], s[1000001];
getchar();
scanf("%[^\n]", w);getchar();
scanf("%[^\n]", s);
int lenw = strlen(w), lens = strlen(s);
strlwr(w);strlwr(s);
s[lens] = ' ';s[lens + 1] = '\0';
char *p, *pos = s;
printf("case #%d:\n", t);
while(1){
p = strstr(pos, w);
if (!p) break;
if (p == s && *(s + lenw) == ' ') break;
if (*(p - 1) == ' ' && *(p + lenw) == ' ') break;
pos = p + lenw;
}
if (!p) printf("None\n");
else printf("%d\n", p - s + 1);
}
return 0;
}