開啟章節選單

10252 Common Permutation

題目連結

題目翻譯

給定兩個全為小寫字母的字串 a 和 b,請找出最長的字串 x,使得 x 的某個排列是 a 的子序列,且 x 的另一個排列是 b 的子序列。

輸入

輸入包含多組測資,每兩行為一組:第一行是字串 a,第二行是字串 b,每個字串長度最多 1000 個小寫字母。

輸出

每組測資輸出一行 x;若有多組答案長度相同,輸出其中字母順序(alphabetical order)最小的那一個。

解題思路

題目只要求「x 的某個排列」是子序列,並未要求字母的相對順序,所以本質上就是比較兩字串中每個字母各自出現的次數,取兩邊次數的較小值;接著依照 a 到 z 的順序,把每個字母重複輸出對應的次數,就是長度最大、且字典序最小的答案。

程式碼

#include <bits/stdc++.h>
using namespace std;
//author:Jackis666
signed main(){
    ios::sync_with_stdio(0),cin.tie(0);
    string s,t;
    while(getline(cin,s)){
        getline(cin,t);
        vector<int> a(26,0),b(26,0);
        for(auto c:s) if(c>='a') a[c-'a']++;else a[c-'A']++;
        for(auto c:t) if(c>='a') b[c-'a']++;else b[c-'A']++;
        for(int i=0;i<26;i++){
            for(int k=0;k<min(a[i],b[i]);k++){
                cout<<(char)('a'+i);
            }
        }
        cout<<"\n";
    }
}