题目描述
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
提示:
1 <= ransomNote.length, magazine.length <= 100000
ransomNote
和magazine
由小写英文字母组成
NOTE1:magazine
中的每个字符只能在 ransomNote
中使用一次,也就是说杂志里面的字母不可重复使用。
NOTE2:ransomNote
和 magazine
由小写英文字母组成,这就引出下面的哈希法(26个字母 可以使用数组来解题)
解法一:暴力解法(两个for循环 分别遍历两个字符串,遇到相同的字符就删除,最后判断ransomNote
的长度是否为0,即可得出结果),
- 时间复杂度: O(n^2)
- 空间复杂度: O(1)
std::string::erase()
有几种重载版本:
1)string& erase(size_t index = 0, size_t count = npos);
- 参数:
index
: 起始索引位置(默认为0,即字符串开头)count
: 要删除的字符数量(默认为npos
,即从index
开始所有的字符)
- 返回值: 返回对当前字符串的引用。
2)iterator erase(const_iterator position);
- 参数:
position
: 指向要删除字符的迭代器。
- 返回值: 返回一个迭代器,指向被删除元素之后的元素。
3)iterator erase(const_iterator first, const_iterator last);
- 参数:
first
,last
: 迭代器范围,表示要删除的字符串部分,[first, last)。
- 返回值: 返回一个迭代器,指向被删除的最后一个元素之后的元素。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
for(int i = 0; i < magazine.size() ; i++) {
for(int j = 0; j < ransomNote.size() ; j++) {
if(magazine[i] == ransomNote[j]) {
//遇到相同的字母进行删除
ransomNote.erase(ransomNote.begin() + j);
break;
}
}
}
if(ransomNote.size() == 0) {
return true;
}
else {
return false;
}
}
};
注意: std::string::erase()的时间复杂度 大部分情况下是o(n)的;
解法二:哈希表(因为只有小写字母,可以使用一个26的数组来记录字母出现的次数)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
//因为每个字母只能使用一次 若ransomNote的长度大于magazine的长度 那么一定错
if (ransomNote.size() > magazine.size()) {
return false;
}
for (int i = 0; i < magazine.length(); i++) {
// 通过record数据记录 magazine里各个字符出现次数
//这里就相当于 将magazine中的字母 按照其相对于‘a’的ASCII索引(在26之内)存放在数组中(存放的是同一个字母的个数)
record[magazine[i]-'a'] ++;
}
for (int j = 0; j < ransomNote.length(); j++) {
// 遍历ransomNote,在record里对应的字符个数做--操作
//如上循环 对于数组相同位置进行--,
record[ransomNote[j]-'a']--;
// 如果小于零说明ransomNote里出现的字符,magazine没有
if(record[ransomNote[j]-'a'] < 0) {
return false;
}
}
return true;
}
};
- 时间复杂度: O(n)
- 空间复杂度: O(1)