Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给你一个字符串数组 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] 由英文字母(小写和大写字母)组成
二、思路分析
- 定义一个Map,保存字母对应的行(从0开始,第一行是0,第二行是1,第三行是2)
- 第一行的值都是零,所以第一行就不用写到Map了
- 避免大小写转换,在Map内把大写也加进去
- 利用字符串数组初始化Map,字符串数组为[3]string{"", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"}
- 剩下的就是计算每个word的每个单词在Map内的值是否相等
- 使用continue label简化一下代码(两个循环,直接跳到外层循环继续)
三、AC 代码
func findWords(words []string) []string {
m := map[byte]int{}
strs := []string{"", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"}
for i, str := range strs {
for j := range str {
m[str[j]] = i
}
}
ans := []string{}
LOOP:
for _, word := range words {
n := m[word[0]]
for i := 1; i < len(word); i++ {
if m[word[i]] != n {
continue LOOP
}
}
ans = append(ans, word)
}
return ans
}
四、总结
理解题意之后进行简单的模拟即可。