LeetCode演算法題-Keyboard Row(Java實現)
這是悅樂書的第 245 次更新,第 258 篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第112題(順位題號是500)。給定一個單詞列表,返回可以在美國鍵盤的一行上使用字母表鍵入的單詞,如下圖所示。

image
例如:
輸入:["Hello","Alaska","Dad","Peace"]
輸出:["Alaska","Dad"]
注意:
-
您可以多次使用鍵盤中的一個字元。
-
您可以假設輸入字串僅包含字母。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
題目的意思是從一個字串陣列中找出只由某一行字母(有3行字母)組成的字串,並且作為字串陣列輸出。
對此,我們可以將每一行的字母作為key,行號為value,存入HashMap中。然後我們遍歷字串陣列中的元素,獲取到當前字串,得到其第一個字元所在行號,然後依次判斷剩下字元所在行號,如果和第一個字元所在行號不相等,就將行號重新賦值,如果遍歷完剩下的字元行號不變,就將其新增進list中,最後將list轉為字串陣列作為結果輸出。
public String[] findWords(String[] words) { List<String> list = new ArrayList<String>(); Map<Character, Integer> map = new HashMap<Character, Integer>(); String s1 = "qwertyuiopQWERTYUIOP"; String s2 = "asdfghjklASDFGHJKL"; String s3 = "zxcvbnmZXCVBNM"; for (char ch : s1.toCharArray()) { map.put(ch, 1); } for (char ch : s2.toCharArray()) { map.put(ch, 2); } for (char ch : s3.toCharArray()) { map.put(ch, 3); } for (int i=0; i<words.length; i++) { String ss = words[i]; int floor = map.get(ss.charAt(0)); for (char ch : ss.toCharArray()) { if (floor != map.get(ch)) { floor = map.get(ch); break; } } if (floor == map.get(ss.charAt(0))) { list.add(ss); } } return list.toArray(new String[list.size()]); }
03 第二種解法
針對第一種解法,我們可以使用陣列進行替代,這樣更輕便一些。
依舊是那三行字元組成的字串,存入一個數組中,然後遍歷words中的元素,拿到當前字串後,藉助一個額外的方法getRowNum來獲取某一字元所在的行號,然後判斷該字串剩下的字元,是否依舊存在於該行號所在字串中,全都存在就將其新增進list中,最後將其轉為字串陣列作為結果輸出。
private String[] keyString = {"qwertyuiopQWERTYUIOP", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"}; public String[] findWords2(String[] words) { List<String> list = new ArrayList<String>(); for (int i=0; i<words.length; i++) { int currentRow = getRowNum(words[i].charAt(0)); boolean flag = true; for (char ch : words[i].toCharArray()) { if (keyString[currentRow].indexOf(ch) == -1) { flag = false; } } if (flag) { list.add(words[i]); } } return list.toArray(new String[list.size()]); } public int getRowNum (char ch) { for (int i=0; i<keyString.length; i++) { if (keyString[i].indexOf(ch) != -1) { return i; } } return -1; }
04 第三種解法
還有更加瘋狂的解法,一行程式碼搞定。
public String[] findWords3(String[] words) { return Stream.of(words).filter(s -> s.toLowerCase().matches("[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*")).toArray(String[]::new); }
05 小結
演算法專題目前已 日更超過三個月 ,演算法題文章 112 +篇,公眾號對話方塊回覆【 資料結構與演算法 】、【 演算法 】、【 資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!