Leetcode500:键盘行

原文链接:500. 键盘行 - 力扣(LeetCode)


题目

        给你一个字符串数组 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] 由英文字母(小写和大写字母)组成

题解

方法一:函数调用

解题思路
1、以第一个字符为标准键盘行
2、调用方法,只要找到一个不属于当前键盘行,就返回false
3、根据返回的布尔值决定是否添加当前字符串

时间:1ms 空间:39.6MB

class Solution {
	public boolean f(String s,String str){
        for(int i =0;i<str.length();i++){
            //只要找到一个不符合当前键盘行的字符就返回假
            if(!s.contains(str.charAt(i)+"")){
				return false;
            }
        }
        return true;
    }
    public String[] findWords(String[] words) {
		List<String> list = new ArrayList<>();
        String s1="qwertyuiop";//键盘第一行
        String s2="asdfghjkl";//键盘第二行
        String s3="zxcvbnm";//键盘第三行
        for(String temp : words){
            //先将字符串全部转为小写
            String str = temp.toLowerCase();
            //如果字符串的第一个字符在键盘的第一行
            //调用方法,以下同理
            if(s1.contains(str.charAt(0)+"")){
				if(f(s1,str)){
                    //如果返回值为真,代表字符串的所有字符,都在键盘的第一行,添加入结果列表
                    list.add(temp);
                }
                //返回值为假,继续判断下一个字符串
                else continue;
            }
            else if(s2.contains(str.charAt(0)+"")){
				if(f(s2,str)){
                	list.add(temp);
            	}
                else continue;
            }
            else{
                if(f(s3,str)){
                    list.add(temp);
                }
                else continue;
            }
        }
        //将结果列表转为字符串数组
        return list.toArray(new String[list.size()]);
    }
}

方法二:hash遍历

解题思路
1、每一行存入一个set集合
2、以第一个字符为标准键盘行
3、循环,只要找到一个不属于当前键盘行,就退出循环

时间:0ms 空间:39.2MB

class Solution {
    public String[] findWords(String[] words) {
        List<String> res=new ArrayList<>();
        String s1="qwertyuiop";
        String s2="asdfghjkl";
        String s3="zxcvbnm"; 
        Set<Character> set1=new HashSet<>();
        Set<Character> set2=new HashSet<>();
        Set<Character> set3=new HashSet<>();
        
        //将键盘的每一行存入set集合
        for(int i=0;i<s1.length();++i) set1.add(s1.charAt(i));
        for(int i=0;i<s2.length();++i) set2.add(s2.charAt(i));
        for(int i=0;i<s3.length();++i) set3.add(s3.charAt(i));
        
        //遍历所给的字符串
        for(String word:words){
            int n1=0,n2=0,len=word.length();
            String temp = word.toLowerCase();//转为小写
            
            //记录字符串的第一个元素属于哪一行
            if(set1.contains(temp.charAt(0))) {n1=1;n2=n1;}
            else if(set2.contains(temp.charAt(0))) {n1=2;n2=n1;}
            else if(set3.contains(temp.charAt(0))) {n1=3;n2=n1;}
            
            for(int i=1;i<len&&n1==n2;++i){
                //n2代表当前字符所在的行数,若和第一个字符不在同一行退出循环
                if(set1.contains(temp.charAt(i))) n2=1;
                else if(set2.contains(temp.charAt(i))) n2=2;
                else if(set3.contains(temp.charAt(i))) n2=3;
            }
            if(n1==n2){
                //循环结束,n1和n2不相等代表不在同一行
                res.add(word);
            }
        }
        return res.toArray(new String[res.size()]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值