Problem: 383. 赎金信
文章目录
解题思路
- 建立两个26长度的数组,初始值为0;
- 对两封信按照字母顺序进行对应位置的数组元素加一统计;
- 对勒索信中非0的数组元素与赎金信中进行比对,若是小于或者等于则是通过,可以构成;
解题方法
使用两个数组raCount和maCount分别计量两封信的小写字母组成个数;
统计结束后,直接用勒索信的每个非空字母位置的元素减去对应的赎金信的位置元素,若能拼凑成功则raCount-maCount必定<=0,反之则是raCount-maCount>0的时候就是无法拼凑成功,直接返回false;
如果全部通过,则返回true;
复杂度
时间复杂度:
时间复杂度: O ( l e n R + l e n M + 26 ) O(lenR + lenM + 26) O(lenR+lenM+26)
空间复杂度:
空间复杂度: O ( 52 ) = O ( 1 ) O(52)=O(1) O(52)=O(1)
Code
cpp
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int raCount[26]={0},maCount[26]={0};
int lenR=ransomNote.size();
int lenM=magazine.size();
for(int i=0;i<lenR;i++){
raCount[(ransomNote[i]-'a')]++;
}
for(int i=0;i<lenM;i++){
maCount[(magazine[i]-'a')]++;
}
for(int i=0;i<26;i++){
if(raCount[i]!=0 && (raCount[i]-maCount[i])>0)
return false;
}
return true;
}
};
Code优化
其实可以只使用一个统计数组,先将赎金信的字母统计加入,在按照勒索信的需求减去,如果有不足,对应的数组元素就小于0
空间复杂度: O ( 26 ) = O ( 1 ) O(26)=O(1) O(26)=O(1)
cpp
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int maCount[26]={0};
int lenR=ransomNote.size();
int lenM=magazine.size();
for(int i=0;i<lenM;i++){
maCount[(magazine[i]-'a')]++;
}
for(int i=0;i<lenR;i++){
maCount[(ransomNote[i]-'a')]--;
}
for(int i=0;i<26;i++){
if(maCount[i]<0)
return false;
}
return true;
}
};