20.4.12 赎金信 简单

image.png
时间复杂度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;
    }
};
posted @ 2020-04-12 13:46  肥斯大只仔  阅读(127)  评论(0编辑  收藏  举报