与えられた文字列Jは石の宝石の種類を表し、文字列Sはあなたが所有する石を表します。Sの各文字は、所有している石の種類を表しており、所有している石の数が宝石であるかどうかを知りたいと考えています。
Jの文字は繰り返されず、JとSの文字はすべて文字です。文字は大文字と小文字が区別されるため、「a」と「A」は異なる種類の石です。
例1:
入力:J = "aA"、S = "aAAbbbb"
出力:3
例2:
入力:J = "z"、S = "ZZ"
出力:0
注意:
S 和 J 最多含有50个字母。
J 中的字符不重复。
問題解決のアイデア:
最終的に簡単な問題を考え出すことを望んでいます。この問題の解決策もたくさんあります。1つは直接トラバースするブルートフォース方式です。時間の複雑さはO(mn)です。もう1つは、設定可能なSetを使用することです。宝石の文字を保存し、カウント関数と比較すると、結果がすぐに得られます。コードは次のとおりです。
class Solution {
public:
int numJewelsInStones(string J, string S) {
int count = 0;
int len1 = J.length();
int len2 = S.length();
for(int i = 0; i < len2; i ++){
char stone = S[i];
for(int j = 0; j < len1; j ++){
char jew = J[j];
if(stone == jew){
count ++;
}
}
}
return count;
}
};
セットの使用方法
class Solution {
public:
int numJewelsInStones(string J, string S) {
int count = 0;
unordered_set<char> jewSet;
int len1 = J.length();
int len2 = S.length();
for(int i = 0 ; i < len1; i ++){
char jewel = J[i];
jewSet.insert(jewel);
}
for(int i = 0; i < len2; i ++){
char stone = S[i];
if(jewSet.count(stone)){
count ++;
}
}
return count;
}
};