小白偶尔在互联网上随地乱丢一些赛博垃圾 ,还望拨冗批评斧正。
目录
题目描述
给你两个字符串: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 <= 105
ransomNote
和magazine
由小写英文字母组成
思路分析
既然可以使用 magazine[i] 来访问字符串数组,那我就先从 ransomNote 中从头开始找字母,找到手里拿着一个字母,我就到 magazine 字符串中取出一个数组(将该位置置为“0”),然后再在 ransomNote 中按顺序操作下一个字母。如果在某一次操作中发现在 magazine 中无法找到和手中相同的字母,那么判定为失败。当把 ransomNote 中的所有字母全部遍历一遍之后,判定为成功。
代码实现(C语言)
bool canConstruct(char * ransomNote, char * magazine){
int magazine_length = strlen(magazine);
int ransomNote_length = strlen(ransomNote);
if(magazine_length < ransomNote_length)
{
return false;
}
int maga[magazine_length];
for(int i = 0;i < ransomNote_length;i++)
{
int judge = 1;
for(int j = 0;j < magazine_length;j++)
{
if(ransomNote[i] == magazine[j])
{
judge = 0;
magazine[j] = '0';
break;
}
}
if(judge)
{
return false;
}
}
return true;
}
复杂度分析:
时间复杂度:O(m*n) 其中 m 是 ransomNote 的长度, n 是 magazine 的长度。
空间复杂度:O(m + n) 其中 m 是 ransomNote 的长度, n 是 magazine 的长度。
官方题解(C++)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.size() > magazine.size()) {
return false;
}
vector<int> cnt(26);
for (auto & c : magazine) {
cnt[c - 'a']++;
}
for (auto & c : ransomNote) {
cnt[c - 'a']--;
if (cnt[c - 'a'] < 0) {
return false;
}
}
return true;
}
};
复杂度分析
时间复杂度:O(m+n),其中 m 是 ransomNote 的长度, n 是 magazine 的长度。我们只需要遍历两个字符一次即可。
空间复杂度:O(∣S∣),S 是字符集,这道题中 S 为全部小写英语字母,因此 ∣S∣=26
但是因为我也不会 C++,所以只能照搬惹。。。
力扣刷题网址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
小白不定期在互联网上随地乱丢一些赛博垃圾,还望拨冗批评斧正~