欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 500. Keyboard Row

程序员文章站 2022-07-15 18:36:32
...

LeetCode 500. Keyboard Row

题意:给一个字符串数组,判断哪些字符串可以仅用键盘中的同一行字母拼出。

solution1:hash。记录每个字母的行号。

solution2:数组模拟hash。

总结:

1. 这道题虽然很简单,但是第一次写的时候花了特别多的时间,因为bool same这个变量的声明位置放在了循环外,导致每一次same的初值实际上就是上一次处理的结果。找这个小错误花了很多时间。

2. 做了差不多半个月的hash专项,发现自己会刻意的去思考怎样在题目中用到hash,甚至忽略了一些更优也更好实现的方法。当然专题训练中hash许多时候其实是较好的方法,但是要注意不应该形成这种思维定式。

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        char r1[] = { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' };
        char r2[] = { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l' };
        char r3[] = { 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
        unordered_map<char, int> hash;
        for ( auto c : r1 ) {
            hash[c] = 1;
        }
        for ( auto c : r2 ) {
            hash[c] = 2;
        }
        for ( auto c : r3 ) {
            hash[c] = 3;
        }
        
        vector<string> res;
        for ( auto s : words ) { 
            bool same = 1;
            for ( int i = 1; i < s.length(); i++ ) { 
                char last = tolower(s[i-1]);
                char curr = tolower(s[i]);
                if ( hash[last] != hash[curr] ){
                    same = 0;
                    break;
                }                 
            }
            if ( same ) {
                res.push_back(s);                
            }
        }
        return res;
        
        // 2. array
        /*int no_row[26] = {2,3,3,2,1,2,2,2,1,2,2,2,3,3,1,1,1,1,2,1,1,3,1,3,1,3};
        vector<string> res;
        for ( auto w : words ) {
            bool same = 1;
            for ( int i = 1; i<w.length(); i++ ) {
                if ( no_row[tolower(w[i])-'a'] != no_row[tolower(w[i-1])-'a'] ) {
                    same = 0;
                    break;
                }
            }
            if (same) {
                res.push_back(w);
            }
        }
        return res;*/
    }
};

submission:神奇的是,sol2的操作应该是更简单的,但是两种方案最后运行的时间都是2ms,应该是测试用例太简单了,体现不出差别。

LeetCode 500. Keyboard Row