20.4.12 赎金信 简单
时间复杂度O(n²),空间复杂度应该是O(n)

题目

解题思路

  1. 排序,就可以按顺序来对比知道有没有那个字母和够不够用了;

代码思路

  1. 排除特殊情况;
  2. 用两个vector存起两个string;
  3. 排序;
  4. 循环遍历赎金信,record记录对比杂志magazine相应位置时要后移多少位;
  5. 如果相同,继续遍历,如果不同,magazine的指针后移,即record+1,magazine指针后移不能超过magazine的长度;
  6. 跳出后移循环后,判断,赎金信剩下的长度不能超过magazine剩下的长度,再判断跳出是因为遇到相同的字符还是后移到尽头了。
  7. 用map更好更简单,直接存起magazine各个字母的数量,遍历赎金信的每个字母,在map中遇到,map的value-1,没遇到即返回错误。

代码

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if(ransomNote.length() == 0) return true;
        if(magazine.length() == 0 || ransomNote.length() > magazine.length()) return false;

        vector<char> r;
        r.resize(ransomNote.length());
        r.assign(ransomNote.begin(), ransomNote.end());

        vector<char> m;
        m.resize(magazine.length());
        m.assign(magazine.begin(), magazine.end());

        sort(r.begin(), r.end());
        sort(m.begin(), m.end());


        for(int i = 0, record = 0; i < r.size(); i++){
            if(r[i] == m[i+record]) continue;
            else{
                while(i + record < m.size() - 1 && r[i] != m[i+record]) record++;
                if(r.size() - i > m.size() - i - record) return false;
                if(r[i] != m[i+record]) return false;
            }
        }
        return true;
    }
};

相关文章:

  • 2021-05-16
  • 2021-12-29
  • 2022-02-28
  • 2021-05-25
  • 2021-04-14
  • 2021-12-06
  • 2021-06-29
猜你喜欢
  • 2022-01-03
  • 2022-12-23
  • 2021-11-12
  • 2022-12-23
  • 2022-01-08
  • 2021-11-26
  • 2022-01-11
相关资源
相似解决方案