Leetcode——500. Keyboard Row

题目原址

https://leetcode.com/problems/keyboard-row/description/

题目描述

Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.

这里写图片描述

Example1:

Input: [“Hello”, “Alaska”, “Dad”, “Peace”]
Output: [“Alaska”, “Dad”]

Note:

  • You may use one character in the keyboard more than once.
  • You may assume the input string will only contain letters of alphabet.

解题思路

题目要求是:给定一个字符串数组,返回这个数组中每个字符串中的字符是在同一行上的字符串。

  • 因为给定的字符串中的字符是否在同一行上,只需要判断字符串的每个字符是不是在同一个类型中即可。键盘上的字母只包含3行,在这里就是三类,一类在上面、一类中间、一类下面。
  • 所以首先要把所有字母进行分类,没有什么好的办法,只能把所有的字符一一放进set集合中。(注意大小写,要把大写和小写都放进来)。
  • 然后拿到每个字符串的第一个字符,用第一个字符定位这个字符串所在的位置。
  • 通过for循环判断字符串中剩余字符属于哪一类,如果属于的类不是第一个字符所在的类,那么这个字符串就不符合题意。所以这里面需要添加一个判断标志,如果第一个字符与字符串的其他字符在一类,将该标志置为true
  • 最后将符合题意的字符串放在字符数组中返回即可。

AC代码

class Solution {
    public String[] findWords(String[] words) {
        String[] ret = new String[words.length];
        Set<Character> setUp = new HashSet<Character>();
        Set<Character> setMedium = new HashSet<Character>();
        Set<Character> setDown = new HashSet<Character>();
        setUp.add('Q');setUp.add('W');setUp.add('E');setUp.add('R');setUp.add('T');setUp.add('Y');setUp.add('U');setUp.add('I');setUp.add('O');setUp.add('P');
        setUp.add('q');setUp.add('w');setUp.add('e');setUp.add('r');setUp.add('t');setUp.add('y');setUp.add('u');setUp.add('i');setUp.add('o');setUp.add('p');
        setMedium.add('A');setMedium.add('S');setMedium.add('D');setMedium.add('F');setMedium.add('G');setMedium.add('H');setMedium.add('J');setMedium.add('K');setMedium.add('L');
        setMedium.add('a');setMedium.add('s');setMedium.add('d');setMedium.add('f');setMedium.add('g');setMedium.add('h');setMedium.add('j');setMedium.add('k');setMedium.add('l');
        setDown.add('Z');setDown.add('X');setDown.add('C');setDown.add('V');setDown.add('B');setDown.add('N');setDown.add('M');
        setDown.add('z');setDown.add('x');setDown.add('c');setDown.add('v');setDown.add('b');setDown.add('n');setDown.add('m');
        int count = 0;
        int n = words.length;
        boolean temp = false;
        int m = 0;
        for(int i = 0; i < n; i++) {
            String s = words[i];
            int flag = 0 ;
            temp = false;

            if(setUp.contains(s.charAt(0))){
                flag = 1;               
            }
            else if(setMedium.contains(s.charAt(0)))
            {
                flag = 2;
            }
            else{
                flag = 3;
            }

            for(int j = 1; j < s.length();j++){

                if(setUp.contains(s.charAt(j))){
                    if(flag != 1) {
                        temp = true;
                        break;
                    }
                }
                else if(setMedium.contains(s.charAt(j)))
                {
                    if(flag != 2){
                        temp = true;
                        break;
                    }
                }
                else{
                    if(flag != 3)
                    {
                        temp = true;
                        break;
                    }
                }
            }

            if(!temp) 
                ret[count++] = s;

        }
       for(int i = 0; i < words.length && ret[i] != null ; i++)
            m++;
        String[] re = new String[m];
        for(int i = 0; i < words.length && ret[i] != null; i++)
            re[i] = ret[i];
        return re;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值