【LeetCode】500. 键盘行

版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83374152

1.题目

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。
键盘行题目

2.思路

step1:建立一个map容器,容器中存放键盘中的三行,每行数据对应一个value。
step2:遍历vector向量中的元素,遍历字符串元素中的每一个字母。
step3:对首字母进行判断,先将大写变成小写,判断首字母在map中对应value,将值存入first中。
step4:继续遍历接下来的字母,如果字母对应value与first不一致,则证明不在同一行,flag=false。
step5:判断flag的值,把true的添加到向量v中最后返回主函数。

3.代码

vector<string> findWords(vector<string>& words){
    int len=words.size();
    if(len==0)
    return {};
    map<char,int>mp;
    vector<string> v;
     mp['q'] = 1;mp['w'] = 1;mp['e'] = 1;mp['r'] = 1;mp['t'] = 1;mp['y'] = 1;mp['u'] = 1; mp['i'] = 1;mp['o'] = 1;mp['p'] = 1;
     mp['a'] = 2;mp['s'] = 2;mp['d'] = 2;mp['f'] = 2;mp['g'] = 2;mp['h'] = 2;mp['j'] = 2; mp['k'] = 2;mp['l'] = 2;
     mp['z'] = 3;mp['x'] = 3;mp['c'] = 3;mp['v'] = 3;mp['b'] = 3;mp['n'] = 3;mp['m'] = 3;
    int first=0;
    bool flag=true;
    for(int i=0;i<len;i++){
        flag=true;
        first=0;
        for(int j=0;j<words[i].size();j++){
            if(!first){
                if(words[i][j]<'a')
                    first=mp[words[i][j]+32];
                else first=mp[words[i][j]];
            }
            else if(words[i][j] < 'a'){
                if(mp[words[i][j] + 32] != first){
                     flag= false;
                     break;
                }
            }
            else if(mp[words[i][j]] != first){
                    flag = false;
                    break;
            }
        }
        if(flag)
            v.push_back(words[i]);
    }
    return v;
}

4.优秀案例

不利用map容器,直接体用数组存放对应字母所在行

vector<string> findWords(vector<string>& words) {
        vector<string> res;
        if(words.size()==0)return res;

	int a[26]={2,1,1,2,3,2,2,2,3,2,2,2,1,1,3,3,3,3,2,3,3,1,3,1,3,1};
        //把26个字母对应的行数存放在数组a中
        for(int i=0;i<words.size();i++)
        {
            int ok=1;
            int count;
            if(words[i][0]>'Z')
            {
                count=a[words[i][0]-97];//小写字母
            }
            else
            {
                count=a[words[i][0]-65];//大写字母
            }
            //count用于存放首字母对应行
            
            for(int j=1;j<words[i].length();j++)
            {
                if(words[i][j]>'Z')
                {
                    if(a[words[i][j]-97]!=count)//后面字母与首字母不在一行
                    {
                        ok=0;
                        break;
                    }
                }
                else
                {
                    if(a[words[i][j]-65]!=count)
                    {
                        ok=0;
                        break;
                    }
                }
            }
            
            if(ok)
            {
                res.push_back(words[i]);
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_37621506/article/details/83374152