LeetCode演算法題-Word Pattern(Java實現)
這是悅樂書的第202次更新,第212篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第68題(順位題號是290)。給定一個模式和一個字串str,找到str是否完全匹配該模式。完全匹配是指在模式中的字母和str中的非空單詞之間存在一一對應的關係。例如:
輸入:pattern =“abba”,str =“dog cat cat dog”
輸出:true
輸入:pattern =“abba”,str =“dog cat cat fish”
輸出:false
輸入:pattern =“aaaa”,str =“dog cat cat dog”
輸出:false
輸入:pattern =“abba”,str =“dog dog dog dog”
輸出:false
注意:您可以假設pattern僅包含小寫字母,str包含由單個空格分隔的小寫字母。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 解題
特殊情況:如果pattern或者str為空,返回他們兩個是否相等的判斷。
正常情況:先將str按照空格切分成陣列,然後先判斷陣列大小和pattern的長度,如果不相等直接返回false。使用HashMap,key存入pattern的單個字元,value存入陣列的每一個元素。使用for迴圈,依次獲取pattern的字元,如果map中含有當前字元為key的鍵值對,那麼我們需要判斷此字元對應的value是否等於當前指標對應的陣列元素,如果不相等就直接返回false。 反之,我們就可以把當前字元和當前陣列元素存入map。
但是在存入之前,還需要再判斷一次。如果當前字元和上一個字元不相等,並且當前陣列元素和前一個元素相等,那麼直接返回false,前提就是指標大於等於1,因為map中存入的第一對鍵值對是肯定能夠匹配的。
public boolean wordPattern(String pattern, String str) { if ("" == pattern || "" == str) { return pattern == str; } String[] arr = str.split(" "); if (arr.length != pattern.length()) { return false; } HashMap<Character, String> map = new HashMap<Character,String>(); for (int i=0; i<pattern.length(); i++) { char ch = pattern.charAt(i); if (map.containsKey(ch)) { if (!map.get(ch).equals(arr[i])) { return false; } } else { if (i>=1 && pattern.charAt(i) != pattern.charAt(i-1) && arr[i].equals(arr[i-1])) { return false; } map.put(ch, arr[i]); } } return true; }
此解法因為用到了containsKey()方法,所以時間複雜度最好的情況是O(n),最壞的情況是O(n^2),空間複雜度是O(n)。
03 小結
演算法專題目前已連續日更超過一個月,演算法題文章68+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!