10
社区成员
发帖
与我相关
我的任务
分享#include <iostream>
using namespace std;
int main()
{
string s,s1,s2;
char c;
while(cin>>c,c!=',') s+=c;
while(cin>>c,c!=',') s1+=c;
while(cin>>c) s2+=c;
if(s.size()<s1.size()||s.size()<s2.size())
puts("-1");
else
{
int l;
for(;l+s1.size()<s.size();l++)
{
int k=0;
while(k<s1.size())
{
if(s[l+k]!=s1[k])break;//这块的break之后的k++还读吗 是怎么循环的没看懂 请哪位大佬解答一下
k++;
}
if(k==s1.size()) break;
}
int r=l+s1.size();
while(s2.size()<s.size()-r-s1.size())
{
int j=0;
for(;j<s2.size();j++)
{
if(s[r+j]!=s2[j]) break;
}
if (j==s2.size()) break;//这块也是不知道怎么循环的
r++;
}
l+=s1.size()-1;
if(l>=r||l+s1.size()>r)puts("-1");
else printf("%d/n",r-l-1);
return 0;
}
}
这段代码的主要目的是在给定字符串s中查找两个子字符串s1和s2,然后计算它们之间的字符数量。下面是对代码中两个关键循环的解释:
第一个循环:
for(;l+s1.size()<s.size();l++)
{
int k=0;
while(k<s1.size())
{
if(s[l+k]!=s1[k])break;
k++;
}
if(k==s1.size()) break;
}
这个循环的目的是找到s中第一个子字符串s1的起始位置。它会从s的开头逐个字符检查,如果在s1的可能起始位置找到了与s1匹配的字符,就进入内部的while循环。在内部的while循环中,它会继续检查下一个字符是否匹配,如果匹配,k会递增,否则循环终止。如果在内部的while循环结束时,k等于s1的长度,说明找到了s1的起始位置,此时跳出外部的for循环。
第二个循环:
int r=l+s1.size();
while(s2.size()<s.size()-r-s1.size())
{
int j=0;
for(;j<s2.size();j++)
{
if(s[r+j]!=s2[j]) break;
}
if (j==s2.size()) break;
r++;
}
这个循环的目的是找到s中第二个子字符串s2的起始位置。首先,它计算s1的结束位置r,然后从s的r位置开始检查字符。在内部的for循环中,它会继续检查下一个字符是否匹配s2,如果匹配,j会递增,否则循循环终止。如果在内部的for循环结束时,j等于s2的长度,说明找到了s2的起始位置,此时跳出外部的while循环。
总结:这两个循环的目的是从字符串s中查找子字符串s1和s2的起始位置,并计算它们之间的字符数量。第一个循环找s1,第二个循环找s2。循环中使用break语句来提前结束循环,如果找到了匹配的子字符串,就会退出循环。