分别输入两个字符串A和B,A由多个小字符串组成(中间由非字母隔开),B是由字母组成的字符串。求出A中包含B的小字符串的个数(详细看样例),并且输出它。(不区分大小写)
输入格式:
先输入字符串A,由回车结束。然后输入字符串B。
输出格式:
输出A中包含B字符串的个数、
输入样例:
在这里给出一组输入。例如:
aaBbc4./ewfeAbc wefW%!%&aAbc++0 4Abccabc
aBc
输出样例:
在这里给出相应的输出。例如:
3
解释:
A可以看成:aabbc ewfeabc wefw aabc abccabc小字符串组成的字符串。
包含B的有:ewfeabc aabc abccabc (3个)
思路:
对字符串A进行规范化,即大写变小写,删除非字母字符,用空格标记
字符串B都规范为小写
然后遍历字符串A,需要对字符串A进行截取比较,详情看下面代码
#include<stdio.h>
#include<string.h>
int main()
{
char A[1000000],B[1000000],temp[100];
unsigned int k=0,j=0,count=0;
gets(A);
gets(B);
for(int i=0;A[i]!=0;i++) //字符串A规范化
{
if(A[i]>='A'&&A[i]<='Z') //大写变小写
{
A[k++]=A[i]+32;
}else if(A[i]>='a'&&A[i]<='z')
{
A[k++]=A[i];
}
else //其他字符进行过滤,补空格识别小字符串
{
A[k++]=' ';
while(!((A[i]>='A'&&A[i]<='Z')||(A[i]>='a'&&A[i]<='z')))
{
i++;
}
i--; //while定格到了字母字符,因为后面for循环还要进行++,所以--防止字母字符被漏掉
}
}
A[k]='\0'; //重新定义字符串A,使其成为过滤后的标准字符串
puts(A);
for(int i=0;B[i]!=0;i++) //字符串B转小写方便操作
{
if(B[i]>='A'&&B[i]<='Z')
{
B[i]=B[i]+32;
}
}
puts(B);
j=0;
while(A[j]!='\0') //遍历字符串A
{
if(A[j]==B[0])
{
for( k=0;k<strlen(B);k++) //截取字符串A得到临时字符串temp
{
temp[k]=A[j+k];
}
temp[k]='\0';
if(strcmp(temp,B)==0) //temp字符串与字符串A进行比较
{
count++;
j+=strlen(B)-1; //直接遍历字符串A的下一个小字符串
while(A[j]!=' ')
{
if(A[j]==0) //最后一个小字符串特殊考虑
{
printf("%d",count);
return 0;
}
j++;
}
}
}
j++;
}
printf("%d",count);
return 0;
}