题目来源于知识星球—英雄算法联盟,五月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、500.键盘行(简单)
1.题目描述
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.题目描述
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.题目描述
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.题目描述
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.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!