学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
给定
n
n
n个只包含小写字母的字符串
s
1
,
s
2
,
…
,
s
n
s_1,s_2,\dots , s_n
s1,s2,…,sn,长度均不超过
8
8
8。如果某一个字符串
s
i
(
1
≤
i
≤
n
)
s_i(1\le i\le n)
si(1≤i≤n)能够且只能使用两个字符串
s
j
,
s
k
(
1
≤
j
,
k
≤
n
)
s_j,s_k(1\le j,k\le n)
sj,sk(1≤j,k≤n)顺次拼接而成,即
s
i
=
s
j
+
s
k
s_i=s_j+s_k
si=sj+sk,那么我们就称字符串
s
i
s_i
si是双字符串。
例如,给定
3
3
3个字符串“xiaohou”、“code”和“xiaohoucode”,那么“xiaohoucode”就是一个双字符串,因为“xiaohou”和“code”可以顺次拼接成“xiaohoucode”,而“xiaohou”和“code”不是双字符串。
请你判断给定的
n
n
n个字符串中哪些是双字符串,如果是双字符串,则输出Yes,否则,输出No。
【输入】
第一行,包含一个整数
n
n
n;
接下来
n
n
n行,每行包含一个字符串,第
i
i
i个字符串为
s
i
s_i
si。
【输出】
n
n
n行,对于第
i
i
i行来说,如果
s
i
s_i
si是双字符串,则输出Yes,否则,输出No。
【输入样例】
5
abab
ab
abc
abacb
c
【输出样例】
Yes
No
Yes
No
No
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n;
string s[100010];
map<string, bool> f;
int main()
{
cin >> n;
for (int i=1; i<=n; i++) { // 输入字符串
cin >> s[i];
f[s[i]] = true; // 使用map预处理字符串
}
for (int i=1; i<=n; i++) { // 遍历所有字符串
bool flag = false;
for (int k=1; k<=s[i].size()-1; k++) { // 遍历截取的长度
string x = s[i].substr(0, k), y = s[i].substr(k); // 进行左、右两段截取
if (f.count(x) && f.count(y)) flag = true; // 在map中查找,如果均存在,则置为true
}
if (flag) cout << "Yes" << endl; // 如果true则说明是双字符串
else cout << "No" << endl;
}
return 0;
}
【运行结果】
5
abab
ab
abc
abacb
c
Yes
No
Yes
No
No