字符是否完全相等&&栈操作数组&&字符串相似问题
【摘要】 2068. 检查两个字符串是否几乎相等https://leetcode.cn/problems/check-whether-two-strings-are-almost-equivalent/方法:使用哈希表统计次数,其中word1映射的位置次数++ word2映射的位置次数–然后遍历哈希表看是否有出现次数的绝对值>3次的方法1:使用unordered_mapclass Solution ...
2068. 检查两个字符串是否几乎相等
https://leetcode.cn/problems/check-whether-two-strings-are-almost-equivalent/
方法:使用哈希表统计次数,其中word1映射的位置次数++ word2映射的位置次数–
然后遍历哈希表看是否有出现次数的绝对值>3次的
方法1:使用unordered_map
class Solution {
public:
bool checkAlmostEquivalent(string word1, string word2) {
unordered_map<char,int> um;//哈希表 字符-出现次数
//将word1和word2映射到哈希表,word1对应的字符++ word2对应的字符--
for(int i = 0;i<word1.size();i++)
{
um[word1[i]] ++;
um[word2[i]]--;
}
//遍历哈希表,查看是否有出现次数>3的
for(auto& kv:um)
{
if(abs(kv.second) > 3)
{
return false;
}
}
return true;
}
};
方法2:使用数组
class Solution {
public:
/*
//遍历word1,将每个字母出现的次数统计到哈希表中
//遍历word2,与哈希表中统计的字母进行抵消
//遍历哈希表,判断是否有差值大于3的字母,若有则返回false,否则返回true
*/
bool checkAlmostEquivalent(string word1, string word2) {
int tables[26]= {0};//因为只包含小写字母,建立映射关系
//因为word1和word2长度一样,所以一个循环就可以建立二者的映射
for(int i = 0;i<word1.size();i++)
{
tables[word1[i] - 'a']++;
tables[word2[i]- 'a']--;
}
for(int i = 0;i<26;i++)
{
if(abs(tables[i]) >3)
{
return false;
}
}
return true;
}
};
1441. 用栈操作构建数组
https://leetcode.cn/problems/build-an-array-with-stack-operations/)
class Solution {
public:
//题目要求我们将 list={1-n}当中的数字依次进行Push,Pop操作,使得最终得到的序列与traget序列相同
vector<string> buildArray(vector<int>& target, int n) {
//target 是严格递增的
//遍历target数组
//1.从list中push元素,list最初从1开始
//2.push的元素和当前数比较,不相同就pop掉,然后当前target位置不变,继续判断下一个push的数
//3.当target遍历完成的时候结束
int i = 0;
size_t index = 0;//标志当前target数组来到哪个位置,由于是要和target.size()比较,它是size_t类型,所以index的类型也定义为size_t
int data = 1;//标志data取到list的哪个数
vector<string> ans;//存放Push,Pop的操作
//当index遍历完成target数组结束
while(index<target.size())
{
//不管怎么样,先插入当前data
ans.push_back("Push");
//如果当前data和target[index]的元素不匹配,就要pop掉
if(data != target[index])
{
ans.push_back("Pop");
}
else //如果data != target[index],index不能变,要匹配到target[index]才能遍历下一个数
{
index++;//遍历target的下一个数做匹配
}
data++;//和list的下一个data匹配
}
return ans;
}
};
1704. 判断字符串的两半是否相似
https://leetcode.cn/problems/determine-if-string-halves-are-alike/
方法1:先用字符串vowel定义出 所有的元音字母 “aeiouAEIOU” ->包含大小写!!!
利用string的find函数,遍历前半字符串s,看是否能在字符串vowel中找到该字符,找到了count++ 然后遍历后半部分字符串s同样找元音字母进行抵消,如果最后count为0,则满足条件
class Solution {
public:
bool halvesAreAlike(string s) {
string vowel = "aeiouAEIOU";//元音字母
//利用string的find函数,找到了返回字符在string的下标,找不到返回-1
//遍历前半部分,统计元音字母的个数++
int count = 0;
for(int i = 0;i<s.size()/2;i++)
{
if(vowel.find(s[i]) != -1)
{
//说明当前s[i]字符是元音
count++;
}
}
//遍历后半部分,统计元音字母的个数 --抵消
for(int i = s.size()/2;i<s.size();i++)
{
if(vowel.find(s[i]) != -1)
{
//说明当前s[i]字符是元音
count--;
}
}
//如果最后count为0,说明前半部分和后半部分的元音字符个数相同
return count == 0;
}
};
方法2:将元音字符映射到哈希表,然后遍历字符串s,利用哈希表的find函数统计元音字符个数
哈希表 的find函数,找到了返回迭代器 没找到返回最后一个位置的下一个位置的迭代器end()
class Solution {
public:
bool halvesAreAlike(string s) {
unordered_set<char> us;
string str = "aeiouAEIOU";
//将元音字母映射在哈希表中
for(auto ch:str)
{
us.insert(ch);
}
int count = 0;
//遍历前半部分
for(int i = 0 ;i<s.size()/2;i++)
{
if(us.find(s[i]) != us.end())
{
count++;
}
}
//遍历后半部分
for(int i = s.size()/2;i<s.size();i++)
{
if(us.find(s[i]) != us.end())
{
count--;
}
}
return count == 0;
}
};
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)