【刷爆LeetCode】五月算法集训(2)字符串

题目来源于知识星球—英雄算法联盟,五月算法集训专题

前言

跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!


一、500.键盘行(简单)

1.题目描述

https://img-blog.csdnimg.cn/9228089a7fce408c9bef9d20774f271b.jpeg =500x

2.解题思路

判断给定的字符串是否符合键盘的三行,不区分大小写;再判断给定的字符串中是否
符合题意,最后用ans数组存储满足题意的字符串。

3.代码演示(C++)

class Solution 
{
public:
    bool QWER(char letter)
    {
        if(letter=='Q'||letter=='W'||letter=='E'||letter=='R'||letter=='T'||letter=='Y'||letter=='U'||letter=='I'||letter=='O'||letter=='P'||letter=='q'||letter=='w'||letter=='e'||letter=='r'||letter=='t'||letter=='y'||letter=='u'||letter=='i'||letter=='o'||letter=='p')
        {
            return true;
        }
        else 
        {
            return false;
        }
    } 
    bool Line1(string word)
    {
        int wSize=word.size();
        for(int i=0;i<wSize;i++)
        {
            if(!QWER(word[i]))
            {
                return false;
            }
        }
        return true;
    }
    bool ASD(char letter)
    {
        if(letter=='A'||letter=='S'||letter=='D'||letter=='F'||letter=='G'||letter=='H'||letter=='J'||letter=='K'||letter=='L'||letter=='a'||letter=='s'||letter=='d'||letter=='f'||letter=='g'||letter=='h'||letter=='j'||letter=='k'||letter=='l')
        {
            return true;
        }
        else 
        {
            return false;
        }
    } 
    bool Line2(string word)
    {
        int wSize=word.size();
        for(int i=0;i<wSize;i++)
        {
            if(!ASD(word[i]))
            {
                return false;
            }
        }
        return true;
    }
    bool ZXC(char letter)
    {
        if(letter=='Z'||letter=='X'||letter=='C'||letter=='V'||letter=='B'||letter=='N'||letter=='M'||letter=='z'||letter=='x'||letter=='c'||letter=='v'||letter=='b'||letter=='n'||letter=='m')
        {
            return true;
        }
        else 
        {
            return false;
        }
    } 
    bool Line3(string word)
    {
        int wSize=word.size();
        for(int i=0;i<wSize;i++)
        {
            if(!ZXC(word[i]))
            {
                return false;
            }
        }
        return true;
    }
    bool lfLine(string word)
    {
        if(Line1(word)||Line2(word)||Line3(word))
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
    vector<string> findWords(vector<string>& words) 
    {
        vector<string>ans;
        int wordsSize=words.size();
        for(int i=0;i<wordsSize;i++)
        {
            if(lfLine(words[i]))
            {
                ans.push_back(words[i]);
            }
        }
            return ans;
    }
};

4.题目链接

题目传送门


二、1160.拼写单词(简单)

1.题目描述

![https://img-blog.csdnimg.cn/2d4646142b14485bbfd589dec0946081.jpeg =500x](https://img-blog.csdnimg.cn/34ba24948914459da4ecafdd4bfa5c04.jpeg

2.解题思路

统计chars中字母出现的次数,如果能覆盖words里字母出现的次数,则返回true。

3.代码演示(C++)

class Solution 
{//统计chars中字母出现的次数,如果能覆盖words里字母出现的次数,即返回true
public:
    int countCharacters(vector<string>& words, string chars) 
    {
    vector<int> chars_count = count(chars); // 统计字母表的字母出现次数
    int res = 0;
    for (string& word : words) 
    {
        vector<int> word_count = count(word); // 统计单词的字母出现次数
        if (contains(chars_count, word_count)) 
        {
            res += word.length();
        }
    }
    return res;
}

// 检查字母表的字母出现次数是否覆盖单词的字母出现次数
bool contains(vector<int>& chars_count, vector<int>& word_count) 
{
    for (int i = 0; i < 26; i++) 
    {
        if (chars_count[i] < word_count[i]) 
        {
            return false;
        }
    }
    return true;
}

// 统计 26 个字母出现的次数
vector<int> count(string& word) 
{
    vector<int> counter(26, 0);
    for (char c : word) 
    {
        counter[c-'a']++;
    }
    return counter;
}

};

4.题目链接

题目传送门


三、1047.删除字符串中的所有相邻重复项(简单)

1.题目描述

https://img-blog.csdnimg.cn/43544a780b9f4ca1b4642362deeb23da.jpeg =500x

2.解题思路

声明一个临时栈,存储S中的信息。当存在相邻重复项时,弹出;没有重复元素时,入栈。

3.代码演示(C++)

class Solution 
{
public:
    string removeDuplicates(string S) 
    {
        string stk;//声明一个临时栈,存储S中的信息
        for (char ch : S) 
        {
            if (!stk.empty() && stk.back() == ch)//判断存在相邻重复项时
            {
                stk.pop_back();//弹出
            } 
            else 
            {
                stk.push_back(ch);//没有重复元素时,入栈
            }
        }
        return stk;
    }
};

4.题目链接

题目传送门


四、1935.可以输入的最大单词数(简单)

1.题目描述

https://img-blog.csdnimg.cn/173198a222ce48e0aa327999697ed022.jpeg =500x

2.解题思路

用flag来记录当前字符所在单词是否可以被完全输入。如果当前字符为空格,检查上
一个单词的状态,更新数目并初始化flag;当前字符不可以被输入,更新flag。最后
判断最后一个单词状态并更新数目。

3.代码演示(C++)

class Solution 
{
public:
    int canBeTypedWords(string text, string brokenLetters) 
    {
        unordered_set<char> broken;   // 无法输入的字符集合
        for (char ch: brokenLetters)
        {
            broken.insert(ch);
        }
        int res = 0;   // 可以完全输入的单词数目
        bool flag = true;   // 当前字符所在单词是否可被完全输入
        for (char ch: text)
        {
            if (ch == ' ')
            {
                // 当前字符为空格,检查上一个单词状态,更新数目并初始化 flag
                if (flag)
                {
                    ++res;
                }
                flag = true;
            }
            else if (broken.count(ch))
            {
                // 当前字符不可被输入,所在单词无法被完全输入,更新 flag
                flag = false;
            }
        }
        // 判断最后一个单词状态并更新数目
        if (flag)
        {
            ++res;
        }
        return res;
    }
};

4.题目链接

题目传送门


总结

每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值