本文给出几个判断两个字符串是否互为变形词的方法。
方法一 : 借助Arrays工具类实现
?
class="java" name="code">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/
?