本文给出几个判断两个字符串是否互为变形词的方法。
方法一 : 借助Arrays工具类实现
import java.util.Arrays;
public class AnagramCheck {
public boolean isAnagram(String s1, String s2) {
if (s1 == null || s2 == null || s1.length() != s2.length()) {
return false;
}
char[] ch1 = s1.toCharArray();
char[] ch2 = s2.toCharArray();
Arrays.sort(ch1);
Arrays.sort(ch2);
return Arrays.equals(ch1, ch2);
}
}
当然,方法一并不是最快的方法,但是在绝大部分情况下已经足够好了。
方法二 : 使用String的indexOf方法判断
在该方法中,从头开始判断各个字符是否存在于对方的字符串中,只要有一个不存在,则返回false。
public class AnagramCheck {
public boolean isAnagram(String s1, String s2) {
if (s1 == null || s2 == null || s1.length() != s2.length()) {
return false;
}
int i = 0;
int j = 0;
//不需要判断t j< s2.length()因为s1 和 s2的长度是一样的
while (i < s1.length()) {
if (s1.indexOf(s2.charAt(j)) < 0 || s2.indexOf(s1.charAt(i)) < 0)
return false;
i++;
j++;
}
return true;
}//O(n log n)
}
方法三 : 适用于8位字符集的检测方法
该方法适合只包含8位字符集的字符串,不适合包含中文的字符串比较。
public class AnagramCheck {
public boolean isAnagram(String s1, String s2) {
if (s1 == null || s2 == null || s1.length() != s2.length()) {
return false;
}
/* 假设是8位字符集 */
int[] counts = new int[256];
int len = s1.length();
for (int index = 0; index < len; index++) {
if((int) s1.charAt(index) > 0 && (int) s2.charAt(index) > 0){
counts[(int) s1.charAt(index)]++;
counts[(int) s2.charAt(index)]--;
}
}
for (int index = 0; index < len; index++)
if (counts[index] > 0)
return false;
return true;
}
}
原文地址 http://thecodesample.com/?p=864
更多的例子请访问 http://thecodesample.com/