判断 s2是否是s1的子串

时间:2021-02-27 19:55:33
char s1[80],s[80];
int i=0,j,k,k1,k2,flag;
gets(s1)
gets(s2)
k1=strlen(s1)
k2=strlen(s2)
flag=0;
while(i<k1-k2+1)
{
  j=0,k=i;
while(s2[j]&&s1[k]==s2[j])
{j++;k++;}
if(s2[j]=='\0'){flag=1;break;}
i++;}
if(flag=1) printf("%s,%s\n",s2,s1);
}
 问题:while(i<k1-k2+1)i为什么小于k1-k2+1
 

6 个解决方案

#1


因为从 i = k1 - k2 + 1 这个下标开始,s1 后面的字符个数没有 s2 中个数多了,s2 也就不可能在 s1中,后面的遍历也就没有必要。

#2


引用 1 楼 canshui 的回复:
因为从 i = k1 - k2 + 1 这个下标开始,s1 后面的字符个数没有 s2 中个数多了,s2 也就不可能在 s1中,后面的遍历也就没有必要。

++

#3


举例说明:
s1=12231231123
s2=123

0th
12231231123
123

1th
1 2231231123
  123

2th
12 231231123
    123

3th
122 31231123
      123

...
最大循环次数while(<k1-k2+1)最大值
k1-k2 = 11-3  = 8th
12231231 123
                123

即蓝色字符的个数
122 31231123
123

#4



两步
1 s1中找子串s2的首字符
2 在S1中从找到s2的首字符地址开始,比较和s2相同长度的字符串,

#5


看看KMP..

#6


用std::string::substring

#1


因为从 i = k1 - k2 + 1 这个下标开始,s1 后面的字符个数没有 s2 中个数多了,s2 也就不可能在 s1中,后面的遍历也就没有必要。

#2


引用 1 楼 canshui 的回复:
因为从 i = k1 - k2 + 1 这个下标开始,s1 后面的字符个数没有 s2 中个数多了,s2 也就不可能在 s1中,后面的遍历也就没有必要。

++

#3


举例说明:
s1=12231231123
s2=123

0th
12231231123
123

1th
1 2231231123
  123

2th
12 231231123
    123

3th
122 31231123
      123

...
最大循环次数while(<k1-k2+1)最大值
k1-k2 = 11-3  = 8th
12231231 123
                123

即蓝色字符的个数
122 31231123
123

#4



两步
1 s1中找子串s2的首字符
2 在S1中从找到s2的首字符地址开始,比较和s2相同长度的字符串,

#5


看看KMP..

#6


用std::string::substring