这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
题目描述
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。 第二行由字符 "asdfghjkl" 组成。 第三行由字符 "zxcvbnm" 组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]
输出:[]
示例 3:
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/keyboard-row
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法每日一题是字符串数组处理题目,题意简单明了。
- 整体思路是为每一个英文字母标记其对应键盘上的行号,然后检测字符串中所有字符对应的行号是否相同。
- 在实现代码中,首先预处理计算出每个字符对应的行号。这里可以采用 ASCII 码的知识,ASCII 码是最通用的信息交换标准。简单理解就是将字符转换成数字记录。方便后续使用,快速判断字符属于哪一行。
- 在代码执行的细节中,由于同一字母的大写字母,小写字母都对应的是同一个键盘位置,我们可以简化操作,统一转换成小写字母进行判断。具体实现如下:
通过代码
class Solution {
public String[] findWords(String[] words) {
String[] temp = new String[]{"qwertyuiop","asdfghjkl","zxcvbnm"};
int[] chars = new int[26];
int i = 1;
for (String s : temp) {
for (char c : s.toCharArray()) {
chars[c - 'a'] = i;
}
i++;
}
List<String> list = new ArrayList<>();
for (String word : words) {
int j = -1;
boolean flag = true;
for (char wordChar : word.toCharArray()) {
wordChar = Character.toLowerCase(wordChar);
if (j == -1) {
j = chars[wordChar - 'a'];
} else if (j != chars[wordChar - 'a']) {
flag = false;
break;
}
}
if (flag) {
list.add(word);
}
}
String[] ans = new String[list.size()];
for (int k = 0; k < list.size(); k++) {
ans[k] = list.get(k);
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n * n), 空间复杂度是O(n)
- 今天的每日一题题目简单明了,但是实际实现,并且通过测试,大家可以实际尝试一下。纸上得来终觉浅,绝知此事要躬行!多多写代码,才有助于我们更好的提高!
- 坚持算法每日一题,加油!