与えられた文字列Jは石の宝石の種類を表し、文字列Sはあなたが所有する石を表します。Sの各文字は、所有している石の種類を表しており、所有している石の数が宝石であるかどうかを知りたいと考えています。Jの文字は繰り返されず、JとSの文字はすべて文字です。文字は大文字と小文字が区別されるため、「a」と「A」は異なる種類の石です。
例1:
入力:J = "aA"、S = "aAAbbbb"
出力:3
例2:
入力:J = "z"、S = "ZZ"
出力:0
注意:
SとJには最大50文字を含めることができます。
Jの文字は繰り返されません。
出典:LeetCode771。宝石と石の
リンク:https://leetcode-cn.com/problems/jewels-and-stones/
アルゴリズム1:ダブルforループ
int Fun(string J, string S) {
int i = 0;
for (int j = 0; j < J.length(); j++)
{
for (int s = 0; s < S.length(); s++)
{
if (J[j] == S[s])
i++;
}
}
return i;
}
アルゴリズム2:c ++ find()関数
int numJewelsInStones(string J, string S) {
int cnt = 0;
for (auto s : S)
{
if (find(J.begin(), J.end(), s) != J.end())
{
cnt++;
}
}
return cnt;
}
アルゴリズム3:ハッシュ(ハッシュ)テーブルを実装し、ハッシュテーブルを使用して宝石の種類を記録し、もう一度トラバースして宝石の数を数えます
int numJewelsInStones2(char * J, char * S)
{
int num = 0;//宝石数量
char chars[128] = {
0};//统计J中宝石是否出现,0没有出现,1出现 .hash表
//遍历J,记录宝石出现的种类
while(*J != '\0')
{
chars[*J++] = 1;
}
// 遍历石头,统计宝石的个数
while(*S != '\0')
{
if(chars[*S++] == 1)
{
num++;
}
}
return num;
}
アルゴリズム4:count_if関数とany_if()関数を使用します。
使用法:使用法:bool any_of(InputIterator _First、InputIterator _Last、Predicate _Pred);
int numJewelsInStones(string J, string S) {
return count_if(S.begin(), S.end(),
[&](char ch) {
return any_of(J.begin(), J.end(), [&](char a) {
return a == ch; }); });
}