验证子串
题目描述
输入两个字符串,验证其中一个串是否为另一个串的子串。
输入格式
两行,每行一个字符串。
输出格式
若第一个串 s 1 s_1 s1 是第二个串 s 2 s_2 s2 的子串,则输出(s1) is substring of (s2)
;
否则,若第二个串 s 2 s_2 s2 是第一个串 s 1 s_1 s1 的子串,输出(s2) is substring of (s1)
;
否则,输出 No substring
。
样例 #1
样例输入 #1
abc
dddncabca
样例输出 #1
abc is substring of dddncabca
样例 #2
样例输入 #2
aaa
bbb
样例输出 #2
No substring
提示
对于 100 % 100 \% 100% 的数据,字符串长度在 20 20 20 以内。
方法1
解题思路:
本题要求我们验证两个字符串之间的子串关系。我们可以使用字符串的 find
函数来判断一个字符串是否为另一个字符串的子串。find
函数会返回子串在主串中第一次出现的位置,如果找不到子串,则返回一个特殊值 string::npos
。
具体步骤如下:
- 读取两个字符串 s 1 s_1 s1 和 s 2 s_2 s2。
- 使用
find
函数判断 s 1 s_1 s1 是否为 s 2 s_2 s2 的子串:- 如果
s2.find(s1) != string::npos
,则 s 1 s_1 s1 是 s 2 s_2 s2 的子串,输出(s1) is substring of (s2)
。 - 否则,继续下一步。
- 如果
- 使用
find
函数判断 s 2 s_2 s2 是否为 s 1 s_1 s1 的子串:- 如果
s1.find(s2) != string::npos
,则 s 2 s_2 s2 是 s 1 s_1 s1 的子串,输出(s2) is substring of (s1)
。 - 否则,继续下一步。
- 如果
- 如果以上条件都不满足,说明两个字符串之间没有子串关系,输出
No substring
。
C++代码实现:
#include <iostream>
#include <string>
using namespace std;int main() {string s1, s2;cin>>s1;cin>>s2;if (s2.find(s1) != string::npos) {cout << s1 << " is substring of " << s2 << endl;} else if (s1.find(s2) != string::npos) {cout << s2 << " is substring of " << s1 << endl;} else {cout << "No substring" << endl;}return 0;
}
代码解释:
- 使用
getline
函数读取两个字符串 s 1 s_1 s1 和 s 2 s_2 s2,每个字符串占一行。 - 使用
s2.find(s1) != string::npos
判断 s 1 s_1 s1 是否为 s 2 s_2 s2 的子串:- 如果条件成立,说明 s 1 s_1 s1 是 s 2 s_2 s2 的子串,使用
cout
输出s1 is substring of s2
。 - 否则,继续下一步。
- 如果条件成立,说明 s 1 s_1 s1 是 s 2 s_2 s2 的子串,使用
- 使用
s1.find(s2) != string::npos
判断 s 2 s_2 s2 是否为 s 1 s_1 s1 的子串:- 如果条件成立,说明 s 2 s_2 s2 是 s 1 s_1 s1 的子串,使用
cout
输出s2 is substring of s1
。 - 否则,继续下一步。
- 如果条件成立,说明 s 2 s_2 s2 是 s 1 s_1 s1 的子串,使用
- 如果以上条件都不满足,说明两个字符串之间没有子串关系,使用
cout
输出No substring
。
复杂度分析:
- 时间复杂度: O ( n × m ) O(n \times m) O(n×m),其中 n n n 和 m m m 分别是两个字符串的长度。在最坏情况下,需要遍历两个字符串的所有可能的子串组合。
- 空间复杂度: O ( 1 ) O(1) O(1)。只使用了常数级别的额外空间。
该解决方案利用了 find
函数快速判断子串关系,避免了手动实现子串匹配的过程。通过两次判断,我们可以确定两个字符串之间的子串关系,并输出相应的结果。