给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
代码
初始思路,时间复杂度较高,主要来自于 um_count_leq0 函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { public: int um_count_leq0(unordered_map<char, int> &um) { int count = 0; for (auto it = um.begin(); it != um.end(); it++) { if (it->second <= 0) ++count; } return count; }
bool canConstruct(string ransomNote, string magazine) { unordered_map<char, int> um; for (int i = 0; i < ransomNote.length(); ++i) { ++um[ransomNote[i]]; } for (int i = 0; i < magazine.length(); ++i) { if (um.count(magazine[i])) --um[magazine[i]]; if (um_count_leq0(um) == um.size()) return true; } return false; } };
|
题解思路:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public: bool canConstruct(string ransomNote, string magazine) { if (ransomNote.length() > magazine.length()) return false; vector<int> counts(26, 0); for (int i = 0; i < magazine.length(); ++i) { ++counts[magazine[i] - 'a']; } for (int i = 0; i < ransomNote.length(); ++i) { --counts[ransomNote[i] - 'a']; if (counts[ransomNote[i] - 'a'] < 0) return false; } return true; } };
|