【题目链接】
ybt 1140:验证子串
OpenJudge NOI 1.7 18:验证子串
【题目考点】
1. 字符串处理
2. string类取子串函数
substr(起始位置, 子串长度)
【思路及题解代码】
解法1:用字符数组
- 首先比较两个字符串的长短,若s1的长度大于等于s2的长度,则不操作。如果s1的长度小于s2的长度,那么将s1与s2的值交换。保持s1的长度大于等于s2的长度。此时只需检测s2是否是s1的子串。
- 遍历s1,设变量j,j表示现在看s2的哪一个字符。不断比较s1[i]与s2[j],若二者相同,j增加1,比较后一个字符。若二者不同,j归0。若j的值已经增加至s2的长度,说明s1中存在完整的s2的字符串,那么s2是s1的子串。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s1[205], s2[205], temp[205];
cin>>s1>>s2;
int len1 = strlen(s1), len2 = strlen(s2), t;
if(len1 < len2)
{
strcpy(temp, s1);
strcpy(s1, s2);
strcpy(s2, temp);
t = len1;
len1 = len2;
len2 = t;
}//保持s1的长度大于等于s2的长度
int j = 0;
for(int i = 0; i < len1; ++i)
{
if(s1[i] == s2[j])
{
j++;
if(j == len2)//j已经指向s2的'\0',那么s2是子串
{
cout<<s2<<" is substring of "<<s1;
return 0;
}
}
else
j = 0;
}
cout<<"No substring";
return 0;
}
解法2:用string类,substr函数
- 首先比较两个字符串的长短,若s1的长度大于等于s2的长度,则不操作。如果s1的长度小于s2的长度,那么将s1与s2的值交换。保持s1的长度大于等于s2的长度。此时只需检测s2是否是s1的子串。
- 遍历s1,从每个位置开始,截取长度为s2的长度的子串,看该字符串和s2字符串是否完全相同。string类对象可以直接用=判断相同。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2, st;
cin>>s1>>s2;
if(s1.length() < s2.length())
{
st = s1;
s1 = s2;
s2 = st;
}//使s2比s1短
for(int i = 0; i <= s1.length() - s2.length(); ++i)
{
if(s1.substr(i, s2.length()) == s2)
{
cout<<s2<<" is substring of "<<s1;
return 0;
}
}
cout<<"No substring";
return 0;
}