LeetCode:Valid Anagram - 易位構詞

一、題目名稱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

相關文章
相關標籤/搜索