题意:
        判断短字符串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;
}

时间复杂度:
空间复杂度: