给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]
输出:[]
示例 3:
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
提示:
1 <= words.length <= 20
1 <= words[i].length <= 100
words[i] 由英文字母(小写和大写字母)组成
思路:
先将这三行键盘字母保存在三个字符数组中,然后记录数组中的每一个字符串中的每一个字符出现的次数(这里采用函数strchr:查找某字符在字符串中首次出现的位置,
函数原型:char * strchr (const char *str, int c)
【参数】str 为要查找的字符串,c 为要查找的字符。)
所以,如果出现的次数和字符串本身的长度相等,就说明所有字符都在同一行出现了
bool findChar(char* words, int wordsSize) {
char line1[] = "qwertyuiopQWERTYUIOP";
char line2[] = "asdfghjklASDFGHJKL";
char line3[] = "zxcvbnmZXCVBNM";
int i = 0, j = 0, k = 0;
while (strchr(line1, words[i]) != NULL && i < wordsSize)
{
i++;
}
while (strchr(line2, words[j]) != NULL && j < wordsSize)
{
j++;
}
while (strchr(line3, words[k]) != NULL && k < wordsSize)
{
k++;
}
// 判断count是否等于wordsSize
if ((i == wordsSize) || (j == wordsSize) || (k == wordsSize))
{
return true;
}
else
{
return false;
}
}
char** findWords(char** words, int wordsSize, int* returnSize) {
char** res = (char**)malloc(sizeof(char) * (20 * wordsSize));
memset(res, "\0", sizeof(char) * (20 * wordsSize));
*returnSize = 0;
for (int i = 0; i < wordsSize; i++)
{
int n = strlen(words[i]);
if (findChar(words[i], n))
{
res[(*returnSize)++] = words[i];
}
}
return res;
}