题意:
判断短字符串S中的所有字符是否在长字符串T中全部出现。
如果短字符串的所有字符均在长字符串中出现过,则输出字符串"true"。否则输出字符串"false"。
方法一
数组标记
思路:设置标记数组,标记s字符串出现的字符;然后,用字符串t消除s字符串出现的字符;最后,遍历标记数组;如果发现还有字符被标记,则说明长字符串未全部包含短字符串。
#include <bits/stdc++.h>
using namespace std;
int cnt[26];
int main(){
string s,t;
while(cin >> s >> t){
memset(cnt,0,sizeof(cnt));//初始化为0
int len1=s.size(),len2=t.size();
for(int i=0;i<len1;i++){//标记s字符串出现的字符
cnt[s[i]-'a']=1;
}
for(int i=0;i<len2;i++){//用字符串t消除s字符串出现的字符
cnt[t[i]-'a']=0;
}
int flag=0;
for(int i=0;i<26;i++){//如果发现还有字符被标记,则说明长字符串未全部包含短字符串
if(cnt[i]){
cout << "false\n";
flag=1;
break;
}
}
if(flag==0)
cout << "true\n";
}
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
set
思路:首先,向集合插入字符串s的每个字符;然后,再遍历字符串t,用字符串t消除s字符串出现的字符;最后,如果集合还有元素,说明长字符串未全部包含短字符串。
#include <bits/stdc++.h>
using namespace std;
unordered_set<char> st;
int main(){
string s,t;
while(cin >> s >> t){
st.clear();
int len1=s.size(),len2=t.size();
for(int i=0;i<len1;i++){//向集合插入字符串s的每个字符
st.insert(s[i]);
}
for(int i=0;i<len2;i++){//用字符串t消除s字符串出现的字符
unordered_set<char>::iterator it=st.find(t[i]);
if(it!=st.end())
st.erase(it);
}
if(st.size())//如果集合还有元素,说明长字符串未全部包含短字符串
cout << "false\n";
else
cout << "true\n";
}
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号