500. Keyboard Row 难度:简单

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值