LeetCode算法題-Valid Anagram(Java實現)

這是悅樂書的第198次更新,第205篇原創 <br/>算法

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第61題(順位題號是242)。給定兩個字符串s和t,寫一個函數來肯定t是不是s的anagram。例如:數組

輸入:s =「anagram」,t =「nagaram」數據結構

輸出:trueeclipse

輸入:s =「rat」,t =「car」函數

輸出:false工具

注意:您能夠假設該字符串僅包含小寫字母。開發工具

跟進:若是輸入包含unicode字符怎麼辦? 您如何使您的解決方案適應這種狀況? <br/> 本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。 <br/>測試

02 第一種解法

關於題目中anagram的意思,結合給出的兩個示例,大意就是兩字符串使用的小寫字母同樣,可是每一個字母所處的位置不是全都同樣。此解法是將兩字符串s、t轉換爲字符數組,而後將數組排序,最後比較兩數組的元素是否相等,這裏藉助了工具類Arrays。spa

此解法的時間複雜度是O(nlog(n)),空間複雜度是O(n)。code

public boolean isAnagram(String s, String t) {
    if (s == null || t == null || s.length() != t.length()) {
        return false;
    }
    char[] ch = s.toCharArray();
    char[] ch2 = t.toCharArray();
    Arrays.sort(ch);
    Arrays.sort(ch2);
    return Arrays.equals(ch, ch2);
}

<br/>

03 第二種解法

題目限制了只有英文小寫字母,咱們能夠定義一個長度只有26的整數數組,對字符串進行遍歷,以當前字符減去字符a所表示的整數爲索引,找到對應元素,字符串s所在的字符進行自增,字符串t所在的字符進行自減,而後判斷數組中的元素,只要任一元素不等於0,則說明s和t不知足anagram的條件。

此解法時間複雜度是O(n),空間複雜度是O(1)。

public boolean isAnagram2(String s, String t) {
    if (s == null || t == null || s.length() != t.length()) {
        return false;
    }
    int[] arr = new int[26];
    for (int i=0; i<s.length(); i++) {
        arr[s.charAt(i)-'a']++;
        arr[t.charAt(i)-'a']--;
    }
    for(int num : arr) {
        if (num != 0) {
            return false;
        }
    }
    return true;
}

<br/>

04 第三種解法

使用HashMap,key爲字符串的單個字符,value爲此字符出現的次數,這裏藉助HashMap的getOrDefault方法來實現,若是存在該key,返回對應的value,不然返回默認值。

先將字符串s的每一個字符存入HashMap中,而後遍歷字符串字符串t,依次獲取每個字符,若是當前字符不在HashMap中存在,直接返回false,而後將字符存進HashMap中,value值減1,若是當前字符的出現次數爲0了,將其remove掉,最後判斷HashMap是否爲空。

此解法由於用到了map.containsKey()方法,因此時間複雜度最好的狀況是O(n),最壞的狀況是O(n^2),空間複雜度是O(n)。

public boolean isAnagram3(String s, String t) {
    if (s == null || t == null || s.length() != t.length()) {
        return false;
    }
    HashMap<Character,Integer> map = new HashMap<Character,Integer>();
    for (int i=0; i<s.length(); i++) {
        char ch = s.charAt(i);
        map.put(ch, map.getOrDefault(ch, 0)+1);
    }
    for (int j=0; j<t.length(); j++) {
        char ch = t.charAt(j);
        if (!map.containsKey(ch)) {
            return false;
        }
        map.put(ch, map.get(ch)-1);
        if (map.get(ch) == 0) {
            map.remove(ch);
        }
    }
    return map.isEmpty();
}

此解法是能夠應對那些帶有unicode字符的字符串,固然也可使用像第二種解法的那樣,使用數組,可是數組容量要擴大到256,其餘的思路都是同樣的。 <br/>

05 小結

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

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

相關文章
相關標籤/搜索