力扣每日一题-第26天-496.下一个更大元素Ⅰ

2022.6.24今天你刷题了吗?


题目:

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。

分析:

也就是说给你一些字符串,你需要判断是不是在同一行,如果是则返回,否则则不返回。

思路:利用暴力求解,先判断字符串第一个字母确定它处于哪一行,然后依次判断后面的字符是不是属于改行。

解析:

1.暴力求解

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        vector<string>vec;
        int row1 = 0;
        int flag = 0;
        int successflag = 0;
        
        for (auto i = 0; i < words.size(); i++)
        {
            for (auto& j : words[i])
            {
                if (flag == 0)
                {
                    if (j == 'q' || j == 'w' || j == 'e' || j == 'r' || j == 't' || j == 'y' || j == 'u' || j == 'i' || j == 'o' || j == 'p' || j == 'Q' || j == 'W' || j == 'E' || j == 'R' || j == 'T' || j == 'Y' || j == 'U' || j == 'I' || j == 'O' || j == 'P')
                    {
                        row1 = 1;
                        flag = 1;
                        successflag = 1;
                    }
                    else if (j == 'a' || j == 's' || j == 'd' || j == 'f' || j == 'g' || j == 'h' || j == 'j' || j == 'k' || j == 'l' || j == 'A' || j == 'S' || j == 'D' || j == 'F' || j == 'G' || j == 'H' || j == 'J' || j == 'K' || j == 'L')
                    {
                        row1 = 2;
                        flag = 1;
                        successflag = 1;
                    }
                    else
                    {
                        row1 = 3;
                        flag = 1;
                        successflag = 1;
                    }
                }
                else
                {
                    
                    if (row1==1&&(j == 'q' || j == 'w' || j == 'e' || j == 'r' || j == 't' || j == 'y' || j == 'u' || j == 'i' || j == 'o' || j == 'p' || j == 'Q' || j == 'W' || j == 'E' || j == 'R' || j == 'T' || j == 'Y' || j == 'U' || j == 'I' || j == 'O' || j == 'P' ))
                    {
                        successflag = 1;
                    }
                    else if ( row1 == 2&&(j == 'a' || j == 's' || j == 'd' || j == 'f' || j == 'g' || j == 'h' || j == 'j' || j == 'k' || j == 'l' || j == 'A' || j == 'S' || j == 'D' || j == 'F' || j == 'G' || j == 'H' || j == 'J' || j == 'K' || j == 'L'))
                    {
                        successflag = 1;
                    }
                    else if ( row1 == 3&&(j == 'z' || j == 'x' || j == 'c' || j == 'v' || j == 'b' || j == 'n' || j == 'm' || j == 'Z' || j == 'X' || j == 'C' || j == 'V' || j == 'B' || j == 'N' || j == 'M'  ))
                    {
                        successflag = 1;
                    }
                    else
                    {
                        successflag = 0;
                        break;
                    }
                }
                
            }
            if (successflag == 1)
            {
                vec.emplace_back(words[i]);
                flag = 0;
            }
            else
            {
                flag = 0;
            }
        }

        return vec;
    }
};

2.哈希表

先把每行的字符存进三个哈希表,然后我们判断每个字符串,是否存在与某行,这里利用了哈希表的键值对为1,我们看这个哈希表是否存在

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
   
        string one = "qwertyuiopQWERTYUIOP";
        string two = "asdfghjklASDFGHJKL";
        string three = "zxcvbnmZXCVBNM";
        unordered_map<char, int>m1, m2, m3;
        for (auto q : one)
        {
            m1[q]++;
        }
        for (auto q : two)
        {
            m2[q]++;
        }
        for (auto q : three)
        {
            m3[q]++;
        }
        vector<string>vec;
        for (auto word : words)
        {
            bool b1 = true;
            bool b2 = true;
            bool b3 = true;
            for (auto &c : word)
            {
                b1 &= m1[c];
                b2 &= m2[c];
                b3 &= m3[c];
            }
            if (b1 || b2 || b3)
            {
                vec.emplace_back(word);
            }
        }
        return vec;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值