题意:
判断短字符串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; }
时间复杂度:空间复杂度: