500. Keyboard Row

本文介绍了一种通过检查单词中字母是否位于键盘同一行的方法,以决定是否将其加入到结果列表中的算法实现。该算法提供了两个主要思路:一是利用字符串数组进行逐个字母检查;二是采用更高效的数据结构来提高查找速度。

终于做出来一个题。首先贴自己的代码。

public class Solution {

            String[] row1 = {"q","w","e","r","t","y","u","i","o","p"};
            String[] row2 = {"a","s","d","f","g","h","j","k","l"};
            String[] row3 = {"z","x","c","v","b","n","m"};
            public boolean isContainRow1(String words){
                for(int i=0;i<10;i++) {

                if (words.contains(row1[i])) return true; 
                }
                return false;
            }

                public boolean isContainRow2(String words){
                for(int i=0;i<9;i++) {
                if (words.contains(row2[i])) return true; 
                }
                return false;
            }
                public boolean isContainRow3(String words){
                for(int i=0;i<7;i++) {
                if (words.contains(row3[i])) return true; 
                }
                return false;
            }
            public String[] findWords(String[] words) {
                List<String> list = new ArrayList<String>();
                for(int i =0;i<words.length;i++) {
                    String cur = words[i];
                    if(
                    ((isContainRow1(cur))&&(!isContainRow2(cur))&&(!isContainRow3(cur)))
                    || ((isContainRow2(cur))&&(!isContainRow1(cur))&&(!isContainRow3(cur)))
                    || ((isContainRow3(cur))&&(!isContainRow1(cur))&&(!isContainRow2(cur)))
                    )
                    list.add(cur);
                }
                return list.toArray(new String[list.size()]);
            }

}

其实最后也卡住在返回String[ ]上面,查过才知道List的转换可以解决返回字符串数组。
后面查询Disscussion,可以进行优化:统计每个单词的起始字母,然后再查看后面的字母是否与其属于同一行。
两种思路
- 一:使用字符串
在键盘的字符串数组key[ ] 里,查询单词的字母是否在里面,可用!contains()或者indexOf() == -1来确定。使用flag来确定是否把当前单词加到结果里面。

       int currentRow = 0;
        boolean found = true;
        for(String s : words)
        {
            currentRow = getCurrentRow(s.charAt(0));
            found = true;
            for(char c: s.toCharArray())
            {
                if(rows[currentRow].indexOf(c) == -1)
                {
                    found = false;
                    break;
                }
            }
            if(found)
               result.add(s);
        }
  • 二:使用别的数据结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值