天天看点

LeetCode-500键盘行

键盘行

题目

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

美式键盘 中:

第一行由字符 “qwertyuiop” 组成。

第二行由字符 “asdfghjkl” 组成。

第三行由字符 “zxcvbnm” 组成。

LeetCode-500键盘行

示例

输入:words = [“Hello”,“Alaska”,“Dad”,“Peace”]

输出:[“Alaska”,“Dad”]

题解

将判断给定的字符串是否由键盘某一行字符组成转换为判断字符串中所有字符是否对应键盘同一行,因此可以为每个英文字母标记其对应的键盘行号,然后遍历字符串,判断其所有字符行号是否一致。

注意:需要将大小写字母统一,便于计算。

更多题解

代码

  1. tolower():将大写字母转换为小写字母

    toupper():将小写字母转换为大写字母

  2. emplace_back():只调用转移构造函数,在插入时直接构造,减少额外空间的开辟,效率更高。

    push_back():调用构造和拷贝函数,首先会调用构造函数构造临时对象,然后调用拷贝构造函数将其放入容器中,临时变量释放,造成临时变量申请资源的浪费。

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        //为每个英文字母分配行号
        string rowIdx="12210111011122000010020202";
        vector<string> ans;
        for(auto& word:words){
        	//记录字符串首字符的行号
            char idx=rowIdx[tolower(word[0])-'a'];
            int n=word.size();
            bool isValid=true;
            //比较行号
            for(int i=1;i<n;++i){
                if(rowIdx[tolower(word[i])-'a']!=idx){
                    isValid=false;
                    break;
                }
            }
            if(isValid){
                ans.emplace_back(word);
            }
        }
        return ans;
    }
};