从父串中统计子串,我们首先要明白我们如何在父串中去寻找到子串。
一般的方法就是使用for循环结构来遍历父串中的每一个字符,挨个与子串的第一个字符比对,如果比对出是相同的,那么就有可能是子串,再在该循环的内部建立一个循环进行判断。
那么我们先实现寻找子串的算法。
//该算法可以寻找是否存在某个子串
#include<stdio.h>
#include<string.h>
int main(){
char a[80],b[80];
int i,j,isfind=0;
//输入父串
gets(a);
//输入子串
gets(b);
for(i=0;i<strlen(a);i++)
{
//如果出现第一个字符相同,那就进入
// 内层循环
if(a[i]==b[0])
{
//初始假定已经找到了
isfind=1;
for(j=0;j<strlen(b);j++)
{
//如果在比对中出现这种不相同的字符,
// 那就没找对,跳出内层循环。
if(a[i+j]!=b[j]){
isfind=0;
break;
}
}
}
//如果找到了,那就跳出外层循环
if(isfind)
break;
}
if(isfind)
{
printf("子串存在");
}else
{
printf("子串不存在");
}
return 0;
}
注意,上述代码只是实现了在父串中寻找是否存在指定的子串。
那么根据上述代码,我们进行一些细节的改动,就可以实现子串的统计效果。
//该算法可以统计父串中子串的出现次数
#include<stdio.h>
#include<string.h>
int main(){
char a[90],b[90];
int i,j,isfind=0,amount=0;
//输入父串
gets(a);
//输入子串
gets(b);
for(i=0;i<strlen(a);i++)
{
//如果出现第一个字符相同,那就进入
// 内层循环
if(a[i]==b[0])
{
//初始假定已经找到了
isfind=1;
for(j=0;j<strlen(b);j++)
{
//如果在比对中出现这种不相同的字符,
// 那就没找对,跳出内层循环。
if(a[i+j]!=b[j]){
isfind=0;
break;
}
}
}
//如果找到了,让amount自增1
if(isfind){
amount++;
isfind=0;
}
}
printf("子串出现次数为%d",amount);
return 0;
}
所以,总的来说,统计父串中子串的数量,我们可以用一个图来表示