トピックスアドレス
https://leetcode-cn.com/problems/ransom-note/
思考
この質問は、最初は文字内部の第2ストリング雑誌で構成することができない文字列の身代金の裁判官を使用するが、ここでは午前2時01分に注意することがあり、質問の非常に明確な意味です。
-
本明細書では「意味を表現するために、フォームの言葉に雑誌の必要性から、各文字の検索を身代金書き込み手紙を公開しないようにするための」第1の点の雑誌で説明したが、文字を再利用することはできません持っています。
-
第二の点、「あなたは2つの文字列が小文字のみが含まれていると仮定することができます。」注小文字のみ、それが重要です
一般的なソリューション
次のように最初のアイデアは、実際に、暴力、ループのための2つは、我々が探し続けを列挙しています。
// 时间复杂度: O(n^2)
// 空间复杂度:O(1)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
for (int i = 0; i < magazine.length(); i++) {
for (int j = 0; j < ransomNote.length(); j++) {
if (magazine[i] == ransomNote[j]) {
ransomNote.erase(ransomNote.begin() + j);
break;
}
}
}
if (ransomNote.length() == 0) {
return true;
}
return false;
}
};
ここでは、時間複雑度は比較的高いが、文字列の削除、消去動作は、もちろん、このコードはまた、この質問を持っていたことができ、また、時間がかかり、また、そこにあります
私たちは、最適なソリューションを考えます
最適化ソリューション
トピックは小文字のみであるため、我々はまた、文字が長さの雑誌に登場した回数を記録し、アレイ26のハッシュ時の戦略のスペースを使用することができ、その配列が必要なransomNoteが含まれているかどうかを確認するためにransomNoteを使用すべての文字。
コードは以下の通りであります:
// 时间复杂度: O(n)
// 空间复杂度:O(1)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
for (int i = 0; i < magazine.length(); i++) {
record[magazine[i]-'a'] ++;
}
for (int j = 0; j < ransomNote.length(); j++) {
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a'] < 0) {
return false;
}
}
return true;
}
};