leetcode 500. Keyboard Row

257 篇文章 17 订阅

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.


Example 1:

Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]

Note:

  1. You may use one character in the keyboard more than once.
  2. You may assume the input string will only contain letters of alphabet.
这个我的思路就是对于一个单词,先看看它的首字母位于键盘的哪一行,接着再对于这个单词剩下的字母匹配是否在那一行内。

import java.util.ArrayList;
import java.util.Arrays;

public class Keyboard_Row_500 {
	char[][] keywords=new char[][]{{'q','w','e','r','t','y','u','i','o','p'},
		{'a','s','d','f','g','h','j','k','l'},
		{'z','x','c','v','b','n','m'}};
	
	private boolean isOK(String word){
		boolean isOK=true;
		word=word.toLowerCase();
		char[] chars=word.toCharArray();
		char firstChar=chars[0];
		int type=2;
		for(int i=0;i<keywords[0].length;i++){
			if(keywords[0][i]==firstChar){
				type=0;
				break;
			}
		}
		if(type!=1){
			for(int i=0;i<keywords[1].length;i++){
				if(keywords[1][i]==firstChar){
					type=1;
					break;
				}
			}
		}
		for(int i=1;i<chars.length;i++){
			char thisChar=chars[i];
			boolean isContains=false;
			for(int j=0;j<keywords[type].length;j++){
				if(thisChar==keywords[type][j]){
					isContains=true;
					break;
				}
			}
			if(isContains==false){
				isOK=false;
				break;
			}
		}
		return isOK;
	}

	public String[] findWords(String[] words) {
		ArrayList<String> s = new ArrayList<String>();
		for(int i=0;i<words.length;i++){
			if(isOK(words[i])==true){
				s.add(words[i]);
			}
		}
		String[] result=new String[s.size()];
		for(int i=0;i<s.size();i++){
			result[i]=s.get(i);
		}
		return result;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Keyboard_Row_500 k = new Keyboard_Row_500();
		String[] words=new String[]{"Hello", "Alaska", "Dad", "Peace"};
		System.out.println(Arrays.toString(k.findWords(words)));
	}

}
然后看到大神有一行的解答:
public String[] findWords(String[] words) {
    return Stream.of(words).filter(s -> s.toLowerCase().matches("[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*")).toArray(String[]::new);
}
这真是。。。正则大法好!
不过正则性能不行啊,它这个跑29个case用了91ms,我的方法只需要4ms...而且他里面用了Stream库和一些我不太懂的函数。。。果然大神用的方法都比较高级!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值