LeetCode 500. Keyboard Row
程序员文章站
2022-07-15 18:36:32
...
题意:给一个字符串数组,判断哪些字符串可以仅用键盘中的同一行字母拼出。
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,应该是测试用例太简单了,体现不出差别。
上一篇: Java实现矩阵相乘
下一篇: 汉诺塔问题