【題目】
寫一個函數(shù)判斷兩個字符串是否是變位詞。
【分析】
變位詞(anagrams)指的是組成兩個單詞的字符相同,但位置不同的單詞。比如說, abbcd和abcdb就是一對變位詞。該題目有兩種思路:
【思路一】
由于變位詞只是字母順序不同,而長度一樣,字符種類一樣。因此只需對兩個字符串進(jìn)行排序,排序后兩個字符串一致則為變位詞。
We are young --- are young We這是一對變位詞。(這種解法算不上最優(yōu),不過清晰、簡單易懂,從實踐角度出發(fā),這可能是解決該問題的上佳之選。但是為了效率,還有更好的解法。)
【思路二】
由于組成變位詞的字符都一樣,因此可以統(tǒng)計每個字符串中字符出現(xiàn)的次數(shù),然后看兩個字符串中各字符出現(xiàn)的次數(shù)是否一致。如果是,則它們是一對變位詞。 可以開一個數(shù)組保存字符出現(xiàn)的次數(shù)。我們可以開一個大小是256的整數(shù)數(shù)組,遍歷第一個字符串,將相應(yīng)的字符出現(xiàn)的次數(shù)加1;遍歷第二個字符串時,將相應(yīng)出現(xiàn)的次數(shù)減1。最后如果數(shù)組中256個數(shù)都是0,說明兩個字符串是一對變位詞。(第一個字符串出現(xiàn)的字符都被第二個字符串出現(xiàn)的字符抵消了)。如果有一個不為0則不是變位詞。
【Java代碼 思路一】
import java.util.Arrays
public class Solution{
/**
* @param s: The first string
* @param b: The second string
* @return true or false
*/
public boolean anagram(String s, String t) {
// write your code here
if( s.length() != t.length())
return false;
return sort(s).equals(sort(t));
}
//字符串排序
public String sort(String s){
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
}
【Java代碼 思路二】
public boolean anagram(String s, String t){
if(s.length() != t.length()){
return false;
}
int[] ascii = new int[256];
for(char i : s.toCharArray())
ascii[i]++;
for(int j=0; j<t.length(); j++){
if(--ascii[t.charAt(j)] < 0)
return false;
}
return true;
}