题目

给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false
magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

  1. 输入:ransomNote = "a", magazine = "b"
  2. 输出:false

示例 2:

  1. 输入:ransomNote = "aa", magazine = "ab"
  2. 输出:false

示例 3:

  1. 输入:ransomNote = "aa", magazine = "aab"
  2. 输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNotemagazine 由小写英文字母组成

    解题方法

    哈希表

    建立哈希表,统计两个字符串中字符个数。
    时间复杂度O(m+n),空间复杂度O(s),对于小写字母s=26
    1. class Solution {
    2. public:
    3. bool canConstruct(string ransomNote, string magazine) {
    4. int num[26] = {0};
    5. int n1 = ransomNote.size();
    6. int n2 = magazine.size();
    7. if(n1>n2) return false;
    8. for (int i = 0; i<n1; i++) {
    9. num[ransomNote[i]-'a']--;
    10. }
    11. for (int i = 0; i<n2; i++) {
    12. num[magazine[i]-'a']++;
    13. }
    14. for (int i = 0; i<26; i++) {
    15. if (num[i]<0) return false;
    16. }
    17. return true;
    18. }
    19. };