码迷,mamicode.com
首页 > 其他好文 > 详细

20.4.12 赎金信 简单

时间:2020-04-12 14:39:27      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:ima   遍历   als   特殊   assign   不同   turn   位置   false   

技术图片
时间复杂度O(n2),空间复杂度应该是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;
    }
};

20.4.12 赎金信 简单

标签:ima   遍历   als   特殊   assign   不同   turn   位置   false   

原文地址:https://www.cnblogs.com/wasi-991017/p/12684941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!