力扣500(java&python)-键盘行(简单)
题目:
给你一个字符串数组 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() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)