首页 > 编程语言 >力扣500(java&python)-键盘行(简单)

力扣500(java&python)-键盘行(简单)

时间:2022-09-30 15:58:41浏览次数:56  
标签:键盘 java python word 力扣 int words 编号 单词

题目:

给你一个字符串数组 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] 由英文字母(小写和大写字母)组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/keyboard-row
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

哈希表:使用哈希表记录每个字母所在键盘行的编号,一个字母由键盘同一行的字母组成,等价于该单词的任意两个字母所在键盘行的编号相同。因此把判断一个单词是否由键盘同一行的字母组成的问题变成首先得到该单词的首字母所在键盘行的编号,然后判断该单词的其余字母所在键盘行的编号是否与首字母所在的键盘行编号相同。

注意:

1.单词中可能既包含大写字母也包含小写字母,因此在记录和判断每个字母所在键盘行的编号时,需要都转换成小写字母,再进行相应的操作。

2.单词都是由英文字母组成,因此可以使用长度为26的数组代替哈希表。

java代码:

 1 class Solution {
 2     public String[] findWords(String[] words){
 3         String[] lettersRow = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
 4         int n = lettersRow.length;
 5         int[] hash = new int[26];
 6         //获取键盘的每行并给编号
 7         for (int i = 0; i < n; i++){
 8             //获取每个单词
 9             String letters = lettersRow[i];
10             int letterscount = letters.length();
11             //给键盘的每行的每个字母进行编号
12             for(int j = 0; j < letterscount; j++){
13                  hash[letters.charAt(j) - 'a'] = i;
14             }
15         }
16         List<String> ans = new ArrayList<String>();
17         for(String word : words){
18             boolean flag = true;
19             int wordLength = word.length();
20             //获取首字母的编号
21             int first = hash[Character.toLowerCase(word.charAt(0)) - 'a'];
22             //判断其他字母是否与首字母编号一致
23             for(int i = 1; i < wordLength; i++){
24                 int currow = hash[Character.toLowerCase(word.charAt(i)) - 'a'];
25                 //如果当前字母编号与首字母编号不相同
26                 if(currow != first){
27                     flag = false;
28                     break;
29                 }
30             }
31             if(flag){
32                 ans.add(word);
33             }
34         }
35         //转化成字符串数组
36         int length = ans.size();
37         String[] rowWords = new String[length];
38         for(int i = 0; i < length; i++){
39             rowWords[i] = ans.get(i);
40         } 
41         return rowWords;
42     }
43 }

 python3代码:

利用python中集合的差集,将输入的每个单词与键盘的每行做差集,如果这个差集为空,则说明这个单词是在键盘的同一行,则将当前单词添加到结果列表中。

1 class Solution:
2     def findWords(self, words: List[str]) -> List[str]:
3         ans, lines = [], ["qwertyuiop", "asdfghjkl", "zxcvbnm"]
4         for word in words:
5             for line in lines:
6                 if not (set(word.lower()) - set(line)):
7                     ans.append(word)
8                     
9         return ans

 小知识:

python中set():set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

标签:键盘,java,python,word,力扣,int,words,编号,单词
From: https://www.cnblogs.com/liu-myu/p/16743941.html

相关文章