【题目】
写一个函数判断两个字符串是否是变位词。
【分析】
变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词。该题目有两种思路:
【思路一】
由于变位词只是字母顺序不同,而长度一样,字符种类一样。因此只需对两个字符串进行排序,排序后两个字符串一致则为变位词。
We are young --- are young We这是一对变位词。(这种解法算不上最优,不过清晰、简单易懂,从实践角度出发,这可能是解决该问题的上佳之选。但是为了效率,还有更好的解法。)
【思路二】
由于组成变位词的字符都一样,因此可以统计每个字符串中字符出现的次数,然后看两个字符串中各字符出现的次数是否一致。如果是,则它们是一对变位词。 可以开一个数组保存字符出现的次数。我们可以开一个大小是256的整数数组,遍历第一个字符串,将相应的字符出现的次数加1;遍历第二个字符串时,将相应出现的次数减1。最后如果数组中256个数都是0,说明两个字符串是一对变位词。(第一个字符串出现的字符都被第二个字符串出现的字符抵消了)。如果有一个不为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;
}