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
++
#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
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
++
#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
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