1. 程式人生 > >leetcode-383-Ransom Note(以空間換時間)

leetcode-383-Ransom Note(以空間換時間)

ini from each 小寫字母 自己的 hat bmi 第一個字符 BE

題目描述:

Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.

Each letter in the magazine string can only be used once in your ransom note.

Note:
You may assume that both strings contain only lowercase letters.

canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true 

要完成的函數:

bool canConstruct(string ransomNote, string magazine)

說明:

1、古時候……綁架者會寫勒索信,要求給贖金,不然就撕票。但為了不被認出自己的字跡,就會從報紙上剪出文字,拼湊成一封勒索信。這道題給定兩個字符串,第一個是綁匪要寫的勒索信的字符串,第二個是報紙上能提供的文字的字符串,要求判斷能不能從第二個字符串中構建出第一個字符串。

第二個字符串中的每個字母只能用一次,兩個字符串中只有小寫字母。

2、這道題有三種做法:

①雙重循環,第一個字符串碰到一個字符就去找第二個字符串中有沒有,這是最慢最沒有效率的做法。

②先排序,再比較,這種做法時間復雜度比①小,但也不快。

③以空間換時間,定義一個長度為26的vector,遍歷一遍第二個字符串,統計所有字母的出現次數,再遍歷一遍第一個字符串,逐個在vector中相應位置上減1。

最後再遍歷一遍vector,看是否存在小於0的數值,如果有,返回false。如果沒有,返回true。

時間復雜度是O(n)

我們采用第三種做法,構造代碼如下:

    bool canConstruct(string ransomNote, string magazine) 
    {   
        vector<int>count(26,0);
        for(char i:magazine)//統計第二個字符串中所有的字母出現次數
            count[i-‘a‘]++;
        for(char i:ransomNote)//在對應的位置上減去1
            count[i-‘a‘]--;
        for(int i:count)//遍歷一遍vector,看是否存在小於0的數值
        {
            if(i<0)
                return false;
        }
        return true;
    }

上述代碼實測24ms,beats 89.66% of cpp submissions。

leetcode-383-Ransom Note(以空間換時間)