【C++刷题】力扣-#500-键盘行

题目描述

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 “qwertyuiop” 组成。
第二行由字符 “asdfghjkl” 组成。
第三行由字符 “zxcvbnm” 组成。

示例

示例 1

输入: words = ["Alaska","Dad","Peace","can"]
输出: ["Alaska","Dad","can"]

示例 2

输入: words = ["omk"]
输出: []

示例 3

输入: words = ["adsdf","sfd"]
输出: ["adsdf","sfd"]

题解

我们可以使用哈希表(集合)来存储每行键盘上的字母,然后检查每个单词是否只包含某一行上的字母。

  1. 初始化哈希表:创建三个哈希表,分别存储键盘每一行上的字母。
  2. 转换大小写:将每个单词中的字母转换为小写,以忽略大小写的差异。
  3. 检查单词:对于每个单词,检查其所有字母是否都在同一个键盘行的哈希表中。
  4. 收集结果:如果一个单词的所有字母都在某一行上,将其添加到结果列表中。

代码实现

vector<string> findWords(vector<string>& words) {
    unordered_set<char> row1{'q', 'w', 'e', 'r', 't',
                             'y', 'u', 'i', 'o', 'p'};
    unordered_set<char> row2{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'};
    unordered_set<char> row3{'z', 'x', 'c', 'v', 'b', 'n', 'm'};
    vector<std::string> result;

    for (auto& word : words) {
        string lowerWord;
        transform(word.begin(), word.end(), std::back_inserter(lowerWord),
                  ::tolower);

        bool fromRow1 = true, fromRow2 = true, fromRow3 = true;
        for (char c : lowerWord) {
            if (row1.find(c) == row1.end())
                fromRow1 = false;
            if (row2.find(c) == row2.end())
                fromRow2 = false;
            if (row3.find(c) == row3.end())
                fromRow3 = false;
        }

        if (fromRow1 && !fromRow2 && !fromRow3)
            result.push_back(word);
        else if (!fromRow1 && fromRow2 && !fromRow3)
            result.push_back(word);
        else if (!fromRow1 && !fromRow2 && fromRow3)
            result.push_back(word);
    }

    return result;
}

复杂度分析

● 时间复杂度:O(n * m),其中 n 是单词列表的长度,m 是单词的平均长度。我们需要遍历每个单词中的每个字符,并检查它是否存在于任何一个键盘行的哈希表中。
● 空间复杂度:O(1),因为我们使用的额外空间是固定的,与输入大小无关。
这个算法通过使用哈希表快速判断字符是否属于同一行的键盘,从而高效地解决了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值