LeetCode.500 键盘行

333 阅读1分钟

这是我参与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 <= 20
  • 1 <= words[i].length <= 100
  • words[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)