Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.
Example 1:
Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
Note:
1. You may use one character in the keyboard more than once.
2. You may assume the input string will only contain letters of alphabet.
算法分析:只要把一个字母一个字母的比对就行了,主要大小写,因为其它位置的字母都可能出现大写的情况。C语言版主要是二级指针,搞了好久。
C语言版
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
char** findWords(char** words, int wordsSize, int* returnSize) {
int key[60] = {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, 0, 0, 0, 0, 0, 0, 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}; //这个数组是把字母表分层,区分大小写。
char** ret = (char **)malloc(sizeof(char*) * wordsSize);
int i, j, count = 0;
for(i = 0; i < wordsSize; i++)
{
int flag = 1, temp = key[words[i][0] - 'A']; //把首字母出现的层数赋给temp。
for(j = 1; j < strlen(words[i]); j++)
{
if(key[words[i][j] - 'A'] != temp) //出现不在一层的字母
{
flag = 0;
break;
}
}
if(flag == 1)
{
ret[count] = (char *)malloc(strlen(words[i]) * sizeof(char));
strcpy(ret[count], words[i]);
count++;
}
}
*returnSize = count;
return ret;
}
Python版
这里用到集合,集合的一些操作看这里。
class Solution(object):
def findWords(self, words):
"""
:type words: List[str]
:rtype: List[str]
"""
row1 = set('qwertyuiopQWERTYUIOP')
row2 = set('asdfghjklASDFGHJKL')
row3 = set('zxcvbnmZXCVBNM')
row_words = []
for w in words:
w_set = set(w)
#这是判断w_set中的元素是否都属于集合rowX。
if w_set <= row1 or w_set <= row2 or w_set <= row3:
row_words.append(w)
return row_words