题解 | #字符串字符匹配#
字符串字符匹配
https://www.nowcoder.com/practice/22fdeb9610ef426f9505e3ab60164c93
解题思路
我的解题方法是依次用短字符串中的字符,去和长字符中遍历一遍,如果有就计数变量加一,最后计数变量的大小和snum大小进行比较,如果相等就是全部出现过
本题主要是要注意以下几点
某个字符在长字符串中多次出现,需要避免重复计数
如:i 范围中的b 可能会在 j 范围内多次出现,因此需要一个标志位去判断是否是第一次出现。
下图展现了snum、lnum,i,j的取值范围,可以帮助理解代码
#include <stdio.h>
int main() {
char Sarr[400]={'\0'},Larr[200]={'\0'};
int snum=0,lnum=0;//snum是短字符串字符数,lnum是长字符串中字符数
int i=0,j=0,num=0;//i和j控制循环,num是统计短字符中在长字符串中出现次数的
int flag=0;//标志位,标志是否是第一次计数
while(scanf("%c",&Sarr[i])!=EOF)
{
if(Sarr[i]=='\n'&&snum==0)
{
snum=i;
}
else if(Sarr[i]=='\n'&& snum!=0 && lnum==0)
{
lnum=i;
break;
}
i++;
}
for(i=0;i<snum;i++)
{
for(j=snum+1;j<lnum;j++)
{
if((Sarr[i]==Sarr[j])&&(flag==0))//如果是第一次计数就进入,num++,标志位置1
{
num++;
flag=1;
}
}
flag=0;//遍历一遍长字符串后,标志位置0
}
if(num==snum)
{
printf("true");
}
else
{
printf("false");
}
return 0;
}

查看24道真题和解析