LeetCode破解之键盘行

180 阅读1分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目描述

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

  • 第一行由字符 "qwertyuiop" 组成。
  • 第二行由字符 "asdfghjkl" 组成。
  • 第三行由字符 "zxcvbnm" 组成。

示例1 :

输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]

示例2 :

输入:words = ["omk"]
输出:[]

示例3 :

输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
解法1哈希表

分析:通过一个哈希表,存储三个字符串

  • "qwertyuiopQWERTYUIOP"的value值为1
  • "asdfghjklASDFGHJKL"的value值为2
  • "zxcvbnmZXCVBNM"的value值为3

遍历给定数组,先取字符串的第一个值为num,是1、2、3其中一个,进入遍历只要有一个不等于num,立即退出,继续遍历下一个字符串

class Solution {
    //判断字符串中的所有字符在hash表的值是否相同
    private boolean check(String word,int[] map){
        int pre = map[Character.toLowerCase(word.charAt(0)) - 'a'];
        for(int i = 1;i < word.length();i++){
            if(map[Character.toLowerCase(word.charAt(i)) - 'a'] != pre)
                return false;
        }
        return true;
    }
    public String[] findWords(String[] words) {
        //手动打表
        int[] map = {2,3,3,2,1,2,2,2,1,2,2,2,3,3,1,1,1,1,2,1,1,3,1,3,1,3};
        List<String> ans = new ArrayList<>();
        for(String word : words){
            if(check(word,map)){
                ans.add(word);
            }
        }
        return ans.toArray(new String[0]);
    }
}
解法2:暴力查找

分析:先判断首字母处于键盘哪行 在详细针对三种情况做循环判断 一旦发现与首字母行数不同 自动执行下一个循环 只有执行到最后的第二层循环才能添加单词到ArrayList中 最后将Arraylist转换成数组输出

class Solution {
    public String[] findWords(String[] words) {
        String r1 = "qwertyuiop";
        String r2 = "asdfghjkl";
        String r3 = "zxcvbnm";
        List<String> res = new ArrayList<>();
        for (String word : words) {
            String wordLow = word.toLowerCase();
            boolean sameRow = true;
            int row = -1;
            if (r1.contains(String.valueOf(wordLow.charAt(0))))
                row = 1;
            else if (r2.contains(String.valueOf(wordLow.charAt(0))))
                row = 2;
            else
                row = 3;
            for (int i = 1; i < wordLow.length(); i++) {
                if ((row==1&&!r1.contains(String.valueOf(wordLow.charAt(i)))) || (row==2&&!r2.contains(String.valueOf(wordLow.charAt(i)))) || (row==3&&!r3.contains(String.valueOf(wordLow.charAt(i))))) {
                    sameRow = false;
                    break;
                }
            }
            if (sameRow) {
                res.add(word);
            }
        }
        return (String[])res.toArray(new String[res.size()]);
    }
}