一、題目名稱javascript
Valid Anagram (易位構詞)java
二、題目地址數組
https://leetcode.com/problems/valid-anagram/函數
三、題目內容code
英文:Given two strings s and t, write a function to determine if t is an anagram of s.排序
中文:給出兩個字符串,寫一個函數判斷t是不是s的易位構詞遊戲
例如:ip
s = "anagram", t = "nagaram", return true.leetcode
s = "rat", t = "car", return false.開發
四、題目分析
易位構詞遊戲的規則能夠參考相關的 維基百科頁面 :易位構詞是一類文字遊戲。它的規則是將組成一個詞或短句的字母從新排列順序,原文中全部字母的每次出現都被使用一次,這樣構造出另一些新的詞或短句。如今咱們要判斷的就是給出兩個字符串s和t,判斷字符串t可否由s經過易位構詞產生。
五、一個超時的方法
在作這個題的時候我第一個想到的方法就是,將s和t兩個字符串先轉換成數組,而後分別對兩個數組進行排序,再對兩個排序後的數組進行逐位比較。若是發現兩個數組中不一致的地方,則返回false,不然返回true。對應的Java代碼以下:
/** * 功能說明:LeetCode 242 - Valid Anagram * 開發人員:Tsybius2014 * 開發時間:2015年8月4日 */ public class Solution { /** * 判斷兩個字符串是否爲易位構詞 * @param s 字符串1 * @param t 字符串2 * @return */ public boolean isAnagram(String s, String t) { if (s == null || t == null || s.length() != t.length()) { return false; } char[] charListS = s.toCharArray(); char[] charListT = t.toCharArray(); char temp; //對字符串s和t進行排序 for (int i = 0; i < charListS.length; i++) { for (int j = i + 1; j < charListT.length; j++) { if (charListS[i] > charListS[j]) { temp = charListS[i]; charListS[i] = charListS[j]; charListS[j] = temp; } if (charListT[i] > charListT[j]) { temp = charListT[i]; charListT[i] = charListT[j]; charListT[j] = temp; } } } //逐個字符比較排序結果 for (int i = 0; i < charListS.length; i++) { if (charListS[i] != charListT[i]) { return false; } } return true; } }
可是,使用這段代碼,OJ返回的結果是超時(Time Limit Exceeded)
六、解題方法1
我又想出了一個辦法,即循環考察字符串s中的各字符,將字符串t中找到的第一個同樣的字符換成字符' '。若是在替換過程當中,發現t中已經沒有合適的字符進行替換,則返回false。若是直到s中的字符循環完都沒有返回false,可認爲s與t中所用到的每一個字母的數量都是一致的。
Java代碼以下:
/** * 功能說明:LeetCode 242 - Valid Anagram * 開發人員:Tsybius2014 * 開發時間:2015年8月4日 */ public class Solution { /** * 判斷兩個字符串是否爲易位構詞 * @param s 字符串1 * @param t 字符串2 * @return */ public boolean isAnagram(String s, String t) { if (s == null || t == null || s.length() != t.length()) { return false; } char[] charListS = s.toCharArray(); char[] charListT = t.toCharArray(); boolean b = false; //逐個用s的字符對t進行替換 for (int i = 0; i < charListS.length; i++) { b = false; for (int j = 0; j < charListT.length; j++) { if (charListS[i] == charListT[j]) { charListT[j] = ' '; b = true; break; } } if (!b) { return false; } } return true; } }
這段代碼的Runtime爲1640ms
七、解題方法2
其實上面提到的那個超時(TLE)的方法,若是用Arrays.sort函數對數組進行排序,就能夠比本身用兩個for循環要快不少。
Java代碼以下:
import java.util.Arrays; /** * 功能說明:LeetCode 242 - Valid Anagram * 開發人員:Tsybius2014 * 開發時間:2015年8月4日 */ public class Solution { /** * 判斷兩個字符串是否爲易位構詞 * @param s 字符串1 * @param t 字符串2 * @return */ public boolean isAnagram(String s, String t) { if (s == null || t == null || s.length() != t.length()) { return false; } char[] charListS = s.toCharArray(); char[] charListT = t.toCharArray(); Arrays.sort(charListS); Arrays.sort(charListT); for (int i = 0; i < charListS.length; i++) { if (charListS[i] != charListT[i]) { return false; } } return true; } }
這個方法用了336ms
八、解題方法3
最後還有一種方法,思路是我在Discuss中看到的,即經過一個長度爲26的整形數組,對應英文中的26個字母a-z。從前向後循環字符串s和t,s中出現某一字母則在該字母在數組中對應的位置上加1,t中出現則減1。若是在s和t中全部字符都循環完畢後,整型數組中的全部元素都爲0,則可認爲s可由易位構詞生成t。
Java代碼以下:
/** * 功能說明:LeetCode 242 - Valid Anagram * 開發人員:Tsybius2014 * 開發時間:2015年8月4日 */ public class Solution { /** * 判斷兩個字符串是否爲易位構詞 * @param s 字符串1 * @param t 字符串2 * @return */ public boolean isAnagram(String s, String t) { if (s == null || t == null || s.length() != t.length()) { return false; } //字母統計 int[] letterCounter = new int[26]; for (int i = 0; i < s.length(); i++) { letterCounter[s.charAt(i) - 'a']++; letterCounter[t.charAt(i) - 'a']--; } //若是s的各個字母數量與t一致,那麼letterCounter數組的元素應該所有爲0 for (int count : letterCounter) { if (count != 0) { return false; } } return true; } }
附:使用JavaScript語言實現的解題代碼(2016年1月23日加入)
方法1:
/** * 判斷兩個字符串是否爲易位構詞 * @param {string} s 字符串1 * @param {string} t 字符串2 * @return {boolean} */ var isAnagram = function(s, t) { if (s === null || t === null || s.length != t.length) { return false; } s = s.split('').sort(); //將字符串轉換爲數組後進行排序 t = t.split('').sort(); for (var i = 0; i < s.length; i++) { if (s[i] != t[i]) { return false; } } return true; };
方法2:
/** * 判斷兩個字符串是否爲易位構詞 * @param {string} s 字符串1 * @param {string} t 字符串2 * @return {boolean} */ var isAnagram = function(s, t) { if (s === null || t === null || s.length != t.length) { return false; } var counter = { }; counter.length = 26; var i; for (i = 0; i < counter.length; i++) { counter[i] = 0; } for (i = 0; i < s.length; i++) { counter[s.charCodeAt(i) - 97]++; //獲取字符串指定位置字符的ASC碼 counter[t.charCodeAt(i) - 97]--; } for (i = 0; i < counter.length; i++) { if (counter[i] !== 0) { return false; } } return true; };
END