LeetCode.953-驗證外語字典順序(Verifying an Alien Dictionary)

這是悅樂書的第364次更新,第392篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第226題(順位題號是953)。在外語中,使人驚訝的是,他們也使用英文小寫字母,但可能使用不一樣的順序。字母表的順序是小寫字母的一些排列。算法

給定用外語編寫的單詞序列以及字母表的順序,當且僅當給定單詞在這種外來語言中按字典排序時才返回true。數組

例1:
輸入:words = [「hello」,「leetcode」],order =「hlabcdefgijkmnopqrstuvwxyz」
輸出:true
說明:因爲'h'在此語言中位於'l'以前,所以序列已排序。數據結構

例2:
輸入:words = [「word」,「world」,「row」],order =「worldabcefghijkmnpqstuvxyz」
輸出:false
說明:因爲'd'在此語言中位於'l'以後,而後是單詞[0]>單詞[1],所以序列未排序。app

例3:
輸入:words = [「apple」,「app」],order =「abcdefghijklmnopqrstuvwxyz」
輸出:false
說明:前三個字符「app」匹配,第二個字符串更短(大小)。根據詞典規則「apple」>「app」,由於'l'>'∅',其中'∅'定義爲空白字符小於任何其餘字符。code

注意排序

  • 1 <= words.length <= 100leetcode

  • 1 <= words [i] .length <= 20字符串

  • order.length == 26get

  • words[i]order中的全部字符都是英文小寫字母。

02 第一種解法

題目的意思是給定一個自定義的字母排列順序,而後根據這個排列順序來判斷字符串數組中的字符串是否是順序排列的,是就返回true,不是就返回false

正常的字母排列順序確定是abcde......xyz這樣,可是題目給的不必定是這樣,因此須要先將字母順序創建起來,使用一個HashMap來存,記爲dictkey爲字母,value爲字母所在的位置(在字符串order中的位置),接着開始處理words中的字符串。

咱們依次比較相鄰的兩個字符串便可,對於先後兩字符串的長度關係,有兩種狀況,二者長度相等或者一長一短,取兩字符串長度中的較小值做爲循環次數的上限,避免越界風險,而且後續還會用到這個較小的字符串長度。

獲取兩字符串當前字符在dict中的value值,而且作減法,若是兩字符所在的位置之差爲0,說明字符相,繼續往下循環,指導不等於0。

若是兩字符所在的位置之差爲-1,說明順序是對的,繼續處理下一批相鄰的字符串便可。

若是兩字符所在的位置之差大於0,即前一個字符串中的當前字符在後一個字符串中的當前字符以後,即後一個字符串應該在前,返回false

若是兩字符所在的位置之差等於0,即其中有個字符串短些,可是兩字符串長度的較小值不等於前一個字符串的長度,即短的字符串在後,返回false,能夠參見題目給的例子三。

public boolean isAlienSorted(String[] words, String order) {
    Map<Character, Integer> dict = new HashMap<Character, Integer>();
    for (int i=0; i<order.length(); i++) {
        dict.put(order.charAt(i), i);
    }
    int n = words.length;
    for (int i=0; i<n-1; i++) {
        int res = 0;
        String s = words[i], s2 = words[i+1];
        int j = s.length(), k = s2.length();
        int min = Math.min(j, k);
        // 只有兩邊的字母相同,循環纔會繼續執行
        for (int m=0; m < min && res == 0; m++) {
            res = dict.get(s.charAt(m))-dict.get(s2.charAt(m));
        }
        if (res > 0 || (res == 0 && min != j)) {
            return false;
        }
    }
    return true;
}


03 第二種解法

針對上面的解法,咱們能夠將HashMap換成26的整型數組,將比較單個字母先後位置的方法獨立了出來,其餘思路都是同樣的。

public boolean isAlienSorted2(String[] words, String order) {
    int[] dict = new int[26]; 
    for (int i=0; i<order.length(); i++) {
        dict[order.charAt(i)-'a'] = i;
    }
    int n = words.length;
    for (int i=0; i<n-1; i++) {
        if (!compareTwoString(words[i], words[i+1], dict)) {
            return false;        
        }                
    }
    return true;
}

public boolean compareTwoString(String s, String s2, int[] dict){
    int i = s.length(), j = s2.length();
    int min = Math.min(i, j);
    int res = 0;
    for (int k=0; k<min && res == 0; k++) {
        res = dict[s.charAt(k)-'a'] - dict[s2.charAt(k)-'a'];
    }
    if (res > 0) {
        return false;
    }
    return res == 0 ? min==i : true;
}


04 小結

算法專題目前已連續日更超過七個月,算法題文章232+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索