3

LeetCode-500-键盘行

 2 years ago
source link: https://segmentfault.com/a/1190000040775038
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

LeetCode-500-键盘行

题目描述:给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:遍历字符

首先,如果wordsnull或者words为空数组,则直接返回空数组,就是没有符合条件的单词。

否则,首先初始化一个MapcharacterMap用于保存行数和对应行所有的字符,然后遍历words中的单词word

  • 首先获取word中的第一个字符为firstCharacter,根据characterMap判断第一个字符firstCharacter在哪一行并记录rowNum
  • 然后,判断word后面的字符是否都在第rowNum行,如果不是,则跳过处理下一个单词;如果是,则把单词添加到结果集里面。

最后返回结果集中的单词。

import java.util.*;

/**
 * @Author: ck
 * @Date: 2021/10/3 10:47 上午
 */
public class LeetCode_500 {
    private static final Map<Integer, Set<Character>> characterMap = new HashMap<>();

    static {
        characterMap.put(1, new HashSet<>(Arrays.asList(new Character[]{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'})));
        characterMap.put(2, new HashSet<>(Arrays.asList(new Character[]{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'})));
        characterMap.put(3, new HashSet<>(Arrays.asList(new Character[]{'z', 'x', 'c', 'v', 'b', 'n', 'm'})));
    }

    public static String[] findWords(String[] words) {
        if (words == null || words.length == 0) {
            return new String[0];
        }
        String[] result = new String[words.length];
        int index = 0, size = 0;
        for (String word : words) {
            if (word == null || word.length() == 0) {
                result[index++] = word;
                size++;
                continue;
            }
            char[] wordArr = word.toCharArray();
            char firstCharacter = wordArr[0];
            int rowNum = 1;
            for (Map.Entry<Integer, Set<Character>> characterEntry : characterMap.entrySet()) {
                if (characterEntry.getValue().contains(Character.toLowerCase(firstCharacter))) {
                    rowNum = characterEntry.getKey();
                    break;
                }
            }
            int i;
            for (i = 1; i < word.length(); i++) {
                if (!characterMap.get(rowNum).contains(Character.toLowerCase(wordArr[i]))) {
                    break;
                }
            }
            if (i == word.length()) {
                result[index++] = word;
                size++;
            }
        }
        return Arrays.copyOf(result, size);
    }

    public static void main(String[] args) {
        String[] words = new String[]{"Hello", "Alaska", "Dad", "Peace"};
        for (String word : findWords(words)) {
            System.out.println(word);
        }
    }
}

【每日寄语】 平平淡淡看世界,踏踏实实写人生。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK