这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战。
题目描述:
500. 键盘行 - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符
"qwertyuiop"组成。 - 第二行由字符
"asdfghjkl"组成。 - 第三行由字符
"zxcvbnm"组成。
示例一
输入: words = ["Hello","Alaska","Dad","Peace"]
输出: ["Alaska","Dad"]
示例二
输入: words = ["omk"]
输出: []
示例三
输入: words = ["adsdf","sfd"]
输出: ["adsdf","sfd"]
提示:
1 <= words.length <= 201 <= words[i].length <= 100words[i]由英文字母(小写和大写字母)组成
思路分析
模拟
这一题也很简单,就以我们生活中的思想来模拟做一下即可。
我们可以先按键盘的每一行,建立一个字符串数组,每一个代表一行里面的字母,然后遍历我们的题目,看是不是在数组的同一位置,是即为同一行。
我们也可以先将每个字母队对应的行数列出来做个哈希表,然后遍历我们的单词,看每个字母的行数是否一致。
AC代码
class Solution {
companion object {
val ROWS = arrayOf("qwertyuiop", "asdfghjkl", "zxcvbnm")
}
fun findWords(words: Array<String>): Array<String> {
if (words.isEmpty()) {
return words
}
val results = arrayListOf<String>()
for (word in words) {
if (isValidWord(word.toLowerCase())) {
results.add(word)
}
}
return results.toTypedArray()
}
private fun isValidWord(word: String): Boolean {
var isValid = true
var applicableRow: String? = null
val chars = word.toCharArray()
for (row in ROWS) {
if (row.indexOf(chars[0]) > -1) {
applicableRow = row
break
}
}
if (applicableRow == null) {
isValid = false
return isValid
}
for (index in 1 until chars.size) {
if (applicableRow.indexOf(chars[index]) == -1) {
isValid = false
return isValid
}
}
return isValid
}
}
总结
so easy 。
参考
键盘行 - 键盘行 - 力扣(LeetCode) (leetcode-cn.com)
【宫水三叶】简单字符串模拟 - 键盘行 - 力扣(LeetCode) (leetcode-cn.com)
Kotlin 解答,时间超过100%kotlin代码,内存超过100%kotlin代码 - 键盘行 - 力扣(LeetCode) (leetcode-cn.com)