這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!