LeetCode哈希表字符类的题目总结

目录

LeetCode1160.拼写单词

LeetCode1189.“气球”的最大数量

LeetCode451.根据字符出现的频率排序

所有木桶计数的问题都可以使用map来代替

LeetCode169.多数元素


找字符类的题目比较简单,也很常见

一般思路就是利用字符对应的ASCII码表生成一个哈希表记录字符出现的次数

然后再根据题意进行查找

LeetCode1160.拼写单词

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        int sum = 0;
        vector<int> v(26);
        for(char ch:chars)
            v[ch-'a']++;//构建一个哈希表
        for(string &w:words){
            vector<int> h(26);
            int i;
            for(i=0;i<w.size();i++){
                if(++h[w[i]-'a']>v[w[i]-'a'])
                    break;
            }
            if(i>=w.size())
                sum+=w.size();
        }
        return sum;
    }
};

LeetCode1189.“气球”的最大数量

如果是Python的话可以直接用count计数超简洁

我用C++是就用哈希表计数,然后数一下比较

虽然思路比较笨,但是内存能击败100%,时间能击败93%

class Solution {
public:
    int maxNumberOfBalloons(string text) {
        //很明显的哈希表字符串类型的题
        int a[26]={0};
        for(int i=0;i<text.size();i++)
            //数每个不同字母出现的次数
            if(text[i]=='b'||text[i]=='a'||text[i]=='l'||text[i]=='o'||text[i]=='n')
                a[text[i]-'a']++;
        //比较b,a,l,n中单词最少的
        int min1 = (1<<21);
        if(a['a'-'a']<min1)
            min1 = a['a'-'a'];
        if(a['b'-'a']<min1)
            min1 = a['b'-'a'];
        if(a['l'-'a']<min1)
            min1 = a['l'-'a'];
        if(a['n'-'a']<min1)
            min1 = a['n'-'a'];
        //比较l和o中数字最小的
        int min2 = a['l'-'a'];
        if(a['o'-'a']<a['l'-'a'])
            min2 = a['o'-'a'];
        min2/=2;
        if(min1<=min2)
            return min1;
        return min2;
    }
};
class Solution {
public:
    int maxNumberOfBalloons(string text) {
        //很明显的哈希表字符串类型的题
        int a[26]={0};
        for(int i=0;i<text.size();i++)
            if(text[i]=='b'||text[i]=='a'||text[i]=='l'||text[i]=='o'||text[i]=='n')
                a[text[i]-'a']++;
        //比较b,a,l,n中单词最少的
        int min1 = (1<<21);
        if(a['a'-'a']<min1)
            min1 = a['a'-'a'];
        if(a['b'-'a']<min1)
            min1 = a['b'-'a'];
        if(a['l'-'a']<min1)
            min1 = a['l'-'a'];
        if(a['n'-'a']<min1)
            min1 = a['n'-'a'];
        //比较l和o中数字最小的
        int min2 = a['l'-'a'];
        if(a['o'-'a']<a['l'-'a'])
            min2 = a['o'-'a'];
        min2/=2;
        if(min1<=min2)
            return min1;
        return min2;
    }
};

LeetCode451.根据字符出现的频率排序

我发誓,这种恶心的题目我很不想做;

看上去没什么用,实际就是没什么用

class Solution {
public:
string frequencySort(string s) {
    unordered_map<char, int> charMap;
    for (const auto ch : s) { charMap[ch]++; }
    sort(s.begin(), s.end(), [&](const char ch1, const char ch2){ return charMap[ch1] == charMap[ch2] ?  ch1 > ch2 : charMap[ch1] > charMap[ch2]; });
    return s;
}
};

所有木桶计数的问题都可以使用map来代替

LeetCode169.多数元素

如果按照以往可定是使用木桶计数法来处理,但是数组的大小不好确定会很麻烦

所有木桶计数的问题都可以用map代替!

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        map<int,int> m;
        for(int i=0;i<nums.size();i++){
            m[nums[i]]++;
            if(m[nums[i]]>nums.size()/2)
                return nums[i];
        }
        return 0;
    }
};
发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104756664