做oj的 检索字符串的题 有几个检查点超时 求看看这个程序哪些部分可以改进节约时间跑的更快 没法用
strlwr
题目是这样的
输入格式:
2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;
第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。
#include <stdio.h>
#include <string.h>
int main(void)
{
char word[11], arti[1000001];
gets(word);
gets(arti);
int i;
for (i = 0; word[i] != '\0'; i++) {
if (word[i] >= 'a')
word[i] -= 'a' - 'A';
}
for (i = 0; arti[i] != '\0'; i++) {
if (arti[i] >= 'a')
arti[i] -= 'a' - 'A';
}
strcat(word," ");
strcat(arti," ");
int p=0,m;
char *a;
while(a=strstr(arti,word))
{
if(a==arti||*(a-1)==' ')
{
if(p==0)
m=a-arti;
p++;
*a=1;
}
}
if(p==0)
{
puts("-1");return 0;
}
printf("%d ",p);
printf("%d",m);
return 0;
}
string searching的问题暴力求解太慢了,常用的算法有
KMP
Rabin–Karp
下面是KMP算法,具体的原理还是去看《算法导论》吧
输出: