- 383.赎金信
:::info
在哈希法中有一些场景就是为数组量身定做的。
为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。
杂志字符串中的每个字符只能在赎金信字符串中使用一次。
你可以假设两个字符串均只含有小写字母。 ::: 代码:(详细注释)
暴力解法
哈希解法// 时间复杂度: 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++) {// 在ransomNote中找到和magazine相同的字符if (magazine[i] == ransomNote[j]) {ransomNote.erase(ransomNote.begin() + j); // ransomNote删除这个字符break;}}}// 如果ransomNote为空,则说明magazine的字符可以组成ransomNoteif (ransomNote.length() == 0) {return true;}return false;}};
分析:// 时间复杂度: 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++) {// 通过recode数据记录 magazine里各个字符出现次数record[magazine[i]-'a'] ++;}for (int j = 0; j < ransomNote.length(); j++) {// 遍历ransomNote,在record里对应的字符个数做--操作record[ransomNote[j]-'a']--;// 如果小于零说明ransomNote里出现的字符,magazine没有if(record[ransomNote[j]-'a'] < 0) {return false;}}return true;}};
在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!
