![](https://img-blog.csdnimg.cn/img_convert/d12e83cb455be4f586f1391418981170.png)
【题解】
暴力解法(两个for循环)
// 时间复杂度: O(n^2)
// 空间复杂度:O(1)
注:
(1)for循环,外层循环是magazine.length(),内层循环是ransomNote.length()
(2)vec.erase(vec.begin()+2);删除vec中的第3个元素,ransomNote.erase(ransomNote.begin() + j);是删除操作,由于j是从0开始,所以直接用j而不是j-1
(3)代码时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,较费时
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
for(int i = 0; i < magazine.length(); i++){
for(int j = 0; j <ransomNote.length(); j++){
// 在ransomNote中找到和magazine相同的字符
if(magazine[i] == ransomNote[j]){
ransomNote.erase(ransomNote.begin() + j);// ransomNote删除这个字符
break;
}
}
}
// 如果ransomNote为空,则说明magazine的字符可以组成ransomNote
if(ransomNote.length() == 0){
return true;
}
return false;
}
};
哈希表
// 时间复杂度: O(n)
// 空间复杂度:O(1)
注:
(1)用一个长度为26的数组还记录magazine里字母出现的次数。
(2)对magazine,ransomNote遍历,对应 record数组中的下标++或--
(3)record[ransomNote[i] - 'a'] < 0 如果小于零说明ransomNote里出现的字符,magazine没有
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
//如果赎金信的长度大于杂志的长度,返回false
if(ransomNote.size() > magazine.size()){
return false;
}
// 通过recode数据记录 magazine里各个字符出现次数
for(int i = 0; i < magazine.length(); i++){
record[magazine[i] - 'a']++;
}
// 遍历ransomNote,在record里对应的字符个数做--操作
for(int i = 0; i < ransomNote.length(); i++){
record[ransomNote[i] - 'a']--;
if(record[ransomNote[i] - 'a'] < 0){// 如果小于零说明ransomNote里出现的字符,magazine没有
return false;
}
}
return true;
}
};
知识点:
(1) vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
v1.erase( v1.begin( ) );//删除v1中的第一个元素
vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1];区间从0开始
(2)插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(3)调用 length() 或 size()
string strTest = "test";
strTest.length(); // 4
strTest.size(); //4