タイトル
あなたの「用語集」(文字列の配列)言葉と「アルファベット」(文字列)文字を付けます。
あなたは「単語」「手紙」の文字と(文字列)(文字)で単語を綴ることができるなら、我々はあなたが言葉を習得したと思います。
注:たびスペリングは、各文字は一度だけ使用することができます文字。
あなたは長さの合計をマスターしているすべての単語に語彙を返します。
例1:
入力:言葉= [「猫」、 「BT」、「帽子」、「木」]、文字=「atach」
出力:6
説明:
答えは3 + 3であるので、文字列「猫」と「帽子」を形成することができます= 6。
例2:
入力:言葉= [ "こんにちは"、 "世界"、 "leetcode"]、文字= "welldonehoneyr"
出力:10
説明:
答えは5 + 5 = 10であるので、文字列"こんにちは"と"世界"を形成することができます。
思考
アルファベットのすべての文字でのCのサブセットでなければならないwは考え対応するアルファベットの文字、およびハッシュ表C対応する周波数を記録し、ハッシュ・テーブルは、その後さらに、対応する単語wの文字の単語、及び周波数番号を記録している、および周波数が超えることができない場合、単語は文字で表すことができる唯一の単語です。改善:コメントの領域に記録する方法の配列を使用することができ、それがBiha Xiのテーブルが速くなりますが、同じ考え方を確認します。次のことを達成するために:
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
if(words.empty()||chars.empty())
return 0;
unordered_map<char, int> c;
for(int i=0 ; i<chars.size(); i++){
char t=chars[i];
c.find(t)==c.end()?c[t]=1:c[t]++;
}
int ans=0;
for(int i=0; i<words.size(); i++){
unordered_map<char, int> w;
int j=0;
for(; j<words[i].size(); j++){
char t=words[i][j];
if(c.find(t)==c.end())
break;
w.find(t)==w.end()?w[t]=1:w[t]++;
if(w[t]>c[t])
break;
}
if(j==words[i].size())
ans+=words[i].size();
}
return ans;
}
};