键盘行&&独一无二的字符串

举报
芒果_Mango 发表于 2022/11/30 23:57:40 2022/11/30
【摘要】 500. 键盘行https://leetcode.cn/problems/keyboard-row/class Solution {public: vector<string> findWords(vector<string>& words) { //建立键盘每一行的字符和行的映射关系,然后遍历vector 如果一个字符串中的所有字符都对应在键盘当中的同一行,则满足要求...

500. 键盘行

https://leetcode.cn/problems/keyboard-row/

image-20220602174435867


class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        //建立键盘每一行的字符和行的映射关系,然后遍历vector 如果一个字符串中的所有字符都对应在键盘当中的同一行,则满足要求
        unordered_map<char,int> um;//字符 - 对应在键盘的哪一行
        //因为未知是大小写的,所以把大小写对应的都映射到哈希表中
        string line1 = "qwertyuiopQWERTYUIOP";//键盘第一行的字符
        string line2 = "asdfghjklASDFGHJKL";//键盘第二行的字符
        string line3 = "zxcvbnmZXCVBNM";//键盘第三行的字符
        //分别建立每一行的建立映射关系
        for(auto ch:line1)
        {
            um[ch] = 1;//第一行的字符的value设置为1
        }
        for(auto ch : line2)
        {
            um[ch] = 2;//第二行的字符的value设置为2
        }
        for(auto ch :line3)
        {
            um[ch] = 3;//第三行的字符的value设置为3
        }
        for(auto kv:um)
        {
            cout <<kv.first<<" "<<kv.second<<endl;
        }
        vector<string> ans;//存储符合要求的字符串
        //遍历容器
        for(auto word : words)
        {
            //word是一个string字符串
            //遍历word,检测word是否每一个字符都在同一行
            cout <<"word[0]"<<word[0]<<endl;
            int row = um[word[0]];//当前字符串的第一个字符所在的行号
            bool flag = true;//标志当前字符串是否符合标准
            for(auto ch:word)
            {
                if(um[ch] != row)//字符不是在同一行
                {
                    flag = false;
                    break;//判断下一个字符串
                }
            }
            if(flag)
            {
                ans.push_back(word);
            }
        }
        return ans;
    }
};

优化一下代码:用vector存放每一行对应的字符(大小写)

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        unordered_map<char,int> um;//映射关系:字符 - 在第几行
        //用一个容器每一行的字符,就不用显得这么繁琐
        vector<string> v{
            "qwertyuiopQWERTYUIOP",
            "asdfghjklASDFGHJKL",
            "zxcvbnmZXCVBNM"
        };
        //建立每一行的映射关系
        for(int i = 0 ; i<3;i++)
        {
            //v[i] ->string
            for(auto ch:v[i])
            {
                um[ch] = i;
            }
        }
        //遍历words容器,找到同一行的字母的单词
        vector<string> ans ;//记录答案
        for(auto word:words)
        {
            //word->string对象
            int row = um[word[0]];//记录当前string对象第一个字符所在的行号
            bool flag = true;
            //判断后序字符和row是否在同一行
            for(auto ch:word)
            {
                if(um[ch] != row)
                {
                    flag = false;
                    break;
                }
            }
            if(flag)
            {
                ans.push_back(word);
            }
        }
        return ans;
    }
};

2053. 数组中第 K 个独一无二的字符串

https://leetcode.cn/problems/kth-distinct-string-in-an-array/

image-20220607091817391

方法:
第一次遍历容器,统计每个字符串出现次数
第二次遍历容器,找到第k个只出现一次的字符串
每次遇到一个出现一次的字符串就k–.当k为0时,该字符串就是第k个只出现一次的字符串

class Solution {
public:
    string kthDistinct(vector<string>& arr, int k) {
        //找到第k个只出现1次的字符串
        unordered_map<string,int> um;//字符串- 出现次数
        //遍历数组,统计每个字符串的出现次数
        for(auto str:arr)
        {
            um[str]++;
        }
        //再次遍历数组,找到第k个只出现1次的字符串
        for(auto str:arr)
        {
            if(um[str] == 1)
            {
                k--;
            }
            //如果k减到0了.说明当前字符串就是第k个只出现1次的字符串
            if(k == 0)
            {
                return str;
            }
        }
        return string();//返回空string匿名对象
    }
};

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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