1. 程式人生 > >LeetCode演算法題-Word Pattern(Java實現)

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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!