鍵盤行
題目描述:給你一個字串陣列
words
,只返回可以使用在 美式鍵盤 同一行的字母列印出來的單詞。示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遍歷字元
首先,如果words為null或者words為空陣列,則直接返回空陣列,就是沒有符合條件的單詞。
否則,首先初始化一個Map為characterMap用於儲存行數和對應行所有的字元,然後遍歷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);
}
}
}
【每日寄語】 平平淡淡看世界,踏踏實實寫人生。