【打卡】——【LeetCode学习计划】《数据结构入门-C++》第6天 字符串

目录

387. 字符串中的第一个唯一字符LeetCode: 387. 字符串中的第一个唯一字符

方法1:哈希表

解析 

383. 赎金信LeetCode: 383. 赎金信

分析 

242. 有效的字母异位词

 方法1:哈希表


387. 字符串中的第一个唯一字符
LeetCode: 387. 字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1

 因为假定只含小写字母

方法1:哈希表

我们可以在第一次遍历字符串时,按字符的出现顺序存储字符,并计数。最后,再从头遍历一遍字符串,对每个字符在哈希表中的值进行判断。若计数为1,即为我们的目标。

解析 

 unordered_map<char,int> hashtable  

创建一个名为hashtable 的 unordered_map (映射到 string )

 hashtable.reserve(26)

reserve(n)

预分配n个元素的存储空间

 hashtable[s[i]] == 1

哈希表中数值出现一次

#include <string>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    int firstUniqChar(string s)
    {
        unordered_map<char,int> hashtable;
        hashtable.reserve(26);
        for (const char ch : s)
        {
            hashtable[ch]++;
        }

        const int n = s.size();
        for (int i = 0;i < n; i++)
        {
            if (hashtable[s[i]] == 1)
                return i;
        }
        return -1;
    }
};

383. 赎金信
LeetCode: 383. 赎金信

题目:

为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。
如果可以构成,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
 

分析 

 1.

题目中并没有说字符串ransomNotemagazine两者之间的长短关系。如果ransomNote的长度大于magazine,那么按题意这是不能构成赎金信的,所以一开始要对两者的长度进行比较,如果是这样就直接返回假值。

2.

magazine字符串为参照,在哈希表中记录每个字符的个数。之后遍历ransomNote字符串时,每个字符的计数减1。最后遍历一遍哈希表,如果有负值,就代表ransomNote中有magazine无法覆盖的字符。 

3.

int *cnts = new int[26]{}

对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加() /*此处摘抄于大佬*/
new(多个对象)数组
new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。 但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。
1
2
int *pia = new int [ 10 ];     // 10个未初始化int
int *pia2 = new int [ 10 ](); // 10个值初始化为0的int
————————————————
版权声明:本文为CSDN博主「zwz2011303359」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zwz2011303359/article/details/80871050

#include <string>
using namespace std;
class Solution
{
public:
    bool canConstruct(string ransomNote, string magazine)
    {
        const int len1 = ransomNote.length(), len2 = magazine.length();
        if (len1 > len2)
            return false;

        int *cnts = new int[26]{};
        for (int i = 0; i < len2; i++)
        {
            cnts[magazine[i] - 'a']++;
        }
        for (int i = 0; i < len1; i++)
        {
            cnts[ransomNote[i] - 'a']--;
        }

        for (int i = 0; i < 26; i++)
        {
            if (cnts[i] < 0)
                return false;
        }
        return true;
    }
};

242. 有效的字母异位词
 

题目:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

 方法1:哈希表

题目中说到两个字符串中每个字符出现的次数相同则为真值,我们也可以使用上题[350. 两个数组的交集 II]的方式去完成。先将字符串s中的字符个数计入哈希表中,然后遍历字符串t,将每个字符的计数减1,如果减完的结果为负数,就说明两个字符串不符合题目要求。

class Solution {
public:
    bool isAnagram(string s, string t) {
        const int n = s.length();
        if (n != t.length())
            return false;

        int *cnts = new int[26]{};
        for (int i = 0; i < n ;i++)
        {
            cnts[s[i] - 'a']++;
        }
        for (int j = 0;j < t.length();j++)
        {
            if (cnts[t[j] - 'a'] == 0)
                return false;
            cnts[t[j] - 'a'] --;
        }
        return true;
    }
};

 

猜你喜欢

转载自blog.csdn.net/qq_62932195/article/details/121884929