您的位置:首页 > 其它

HDOJ 2087 基本字符串处理

2012-09-22 00:36 260 查看
题目链接

题目大意:给你两个字符串,让你求第二个字符串在第一个字符串中出现了几次,注意不能有重叠的区间。

由于这题的数据不大,所以朴素的字符串匹配就能解决问题。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char str[1005],substr[1005];
int len1,len2,cnt;
char *p,*q;

int main()
{
do
{
cnt=0;
scanf("%s",str);
if(str[0]=='#')
break;
scanf("%s",substr);
len1=strlen(str);
len2=strlen(substr);
p=str;
q=substr;
while(p&&p-str<=len1)              //防止p越界
{
if(strncmp(p,q,len2)==0)
{
cnt++;
if(p+len2-str>=len1-1)   //防止p越界
break;
else
p+=len2;
}
else
p++;
}
printf("%d\n",cnt);
}while(1);
return 0;
}


思想也是最简单的,就是回朔。

当然也可以用KMP算法。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char str[1005];
char substr[1005];
int next[1005];
int cnt;

void getnext()         //得到next数组
{
int len=strlen(substr);
next[0]=-1;
int j=-1;
for(int i=1;i<len;i++)
{
while(substr[j+1]!=substr[i]&&j>=0)
j=next[j];
if(substr[j+1]==substr[i])
{
next[i]=j+1;
j++;
}
else
next[i]=-1;
}
}

void getans()
{
int len1=strlen(str),len2=strlen(substr);
int j=-1;
for(int i=0;i<len1;i++)
{
while(str[i]!=substr[j+1]&&j>=0)
j=next[j];
if(str[i]==substr[j+1])
{
j++;
if(j==len2-1)     //匹配成功后的操作
{
j=-1;      //把j设为-1这样就能继续寻找
cnt++;
}
}
}
printf("%d\n",cnt);
}

int main()
{
do
{
cnt=0;
scanf("%s",str);
if(str[0]=='#')
break;
scanf("%s",substr);
getnext();
getans();
}while(1);
//system("pause");
return 0;
}


思想也就不多说了,KMP嘛!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: