[LeetCode] 500.键盘行(Easy)C语言题解

题目

  • 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。
  • [LeetCode] 500.键盘行(Easy)C语言题解_第1张图片

示例

①示例1

  • 输入: [“Hello”, “Alaska”, “Dad”, “Peace”]
  • 输出: [“Alaska”, “Dad”]

说明

你可以重复使用键盘上同一字符。
你可以假设输入的字符串将只包含字母。

①相关话题

  • 哈希表

②题目地址

  • 500. 键盘行 — 力扣网
  • 500. Keyboard Row — leetcode

解题方法

①哈希表

  • 使用数组模拟的哈希表,记录 26 个字母所处的键盘行数,然后根据哈希表判断每个字符串中的字母是否处于同一行。
  • 时间复杂度:O(N^2)。
  • 空间复杂度:O(N)。

代码详解

  • 哈希表
char** findWords(char** words, int wordsSize, int* returnSize) {
    // 用哈希表记录26个字母所处的键盘行数。
    int hash[26] = {1, 0, 0, 1, 2, 1, 1, 1, 2, 1, 1, 1, 0, 0, 2, 2, 2, 2, 1, 2, 2, 0, 2, 0, 2, 0};
    int** result = malloc(sizeof(int*)*wordsSize);
    *returnSize = 0;
    
    for (int i = 0; i < wordsSize; i++) {
        // 用mark记录每行第一个字母所处的键盘行数。
        int mark = hash[tolower(words[i][0])-'a'], len = strlen(words[i]), j = 0;
        
        while (j < len) {
            // 查看之后的字母是否和第一个字母处于键盘的同一行。
            if (hash[tolower(words[i][j])-'a'] != mark)
                break;   
            else if (j == len-1) {
                result[*returnSize] = malloc(sizeof(int)*len);
                result[*returnSize] = words[i];
                (*returnSize)++;
            }
            
            j++;
        }
    }

    return result;
}

附录

  • 我的个人博客:messi1002.top
  • 如有错误或疑惑之处 请联系 [email protected]
  • 所有题目解答:fork me on github

你可能感兴趣的:(LeetCode-C,LeetCode-C)