Skip to content

Commit 37d007f

Browse files
authored
Merge pull request #17 from colorbox/383
383. Ransom Note
2 parents c6ded2d + 5ed7d60 commit 37d007f

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

383/step1.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
4:25
3+
Space O: O(N)
4+
Time O: O(N)
5+
6+
ransomに使用する文字が十分存在するかどうかをカウントすればよいと考える。
7+
magazineにある文字を高速にチェックできないといけないので、ハッシュ(map)にして高速化を考える。
8+
magazineに存在しない文字や、消費し尽くした文字を指定されたらransomは成立しなくなるのでその時点でfalseを返せる。
9+
falseを返さずに最後までチェックし終えたら
10+
*/
11+
/*
12+
mapで`[]`を使用することで不要な初期化処理やnullチェックを削除
13+
*/
14+
class Solution {
15+
public:
16+
bool canConstruct(string ransomNote, string magazine) {
17+
map<char, int> character_count;
18+
for (char c: magazine) {
19+
character_count[c]++;
20+
}
21+
22+
for (char c: ransomNote) {
23+
if (character_count[c] <= 0) {
24+
return false;
25+
}
26+
character_count[c]--;
27+
}
28+
29+
return true;
30+
}
31+
};

383/step2.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
解説や他の人のコードを読んで改良。
3+
おおまかな方針は変えていないが、mapをintの配列にして、charをintとして扱う手法で高速化
4+
*/
5+
class Solution {
6+
public:
7+
bool canConstruct(string ransomNote, string magazine) {
8+
int char_count[26];
9+
for (char c: magazine) {
10+
char_count[c - 97]++;
11+
}
12+
13+
for (char c: ransomNote) {
14+
if (char_count[c - 97] == 0) {
15+
return false;
16+
}
17+
char_count[c - 97]--;
18+
}
19+
20+
return true;
21+
}
22+
};

383/step3.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
97という定数が気持ち悪かったので、'a'に変更、それ以外はstep2と変わらず。
3+
*/
4+
/*
5+
初期化をきちんとするように修正
6+
*/
7+
class Solution {
8+
public:
9+
bool canConstruct(string ransomNote, string magazine) {
10+
int char_count[26];
11+
for(int i = 0; i < 26; i++) {
12+
char_count = 0;
13+
}
14+
15+
for (char c: magazine) {
16+
char_count[c - 'a']++;
17+
}
18+
19+
for(char c: ransomNote) {
20+
if (char_count[c - 'a'] == 0) {
21+
return false;
22+
}
23+
24+
char_count[c - 'a']--;
25+
}
26+
27+
return true;
28+
}
29+
};

0 commit comments

Comments
 (0)