20.4.12 赎金信 简单
Posted wasi-991017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20.4.12 赎金信 简单相关的知识,希望对你有一定的参考价值。
时间复杂度O(n2),空间复杂度应该是O(n)
题目
解题思路
- 排序,就可以按顺序来对比知道有没有那个字母和够不够用了;
代码思路
- 排除特殊情况;
- 用两个vector存起两个string;
- 排序;
- 循环遍历赎金信,record记录对比杂志magazine相应位置时要后移多少位;
- 如果相同,继续遍历,如果不同,magazine的指针后移,即record+1,magazine指针后移不能超过magazine的长度;
- 跳出后移循环后,判断,赎金信剩下的长度不能超过magazine剩下的长度,再判断跳出是因为遇到相同的字符还是后移到尽头了。
- 用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 赎金信 简单的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—383. 赎金信( 数组)—day79
Leetcode刷题100天—383. 赎金信(字符串)—day27