字符是否完全相等&&栈操作数组&&字符串相似问题

举报
芒果_Mango 发表于 2022/11/30 23:59:01 2022/11/30
【摘要】 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/

image-20220610104213296

方法:使用哈希表统计次数,其中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/)

image-20220610104340520

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/

image-20220610105407752

方法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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。