您的位置:首页 > 其它

cci-Q1.4 判断两个字符串是否为变位词

2013-07-09 15:01 393 查看
原文:

Write a method to decide if two strings are anagrams or not.

译文:

写一个函数判断两个字符串是否是变位词。

An anagram is a type of word play, the result of rearranging the letters of a word or phrase to produce a new word or phrase, using all the original letters exactly once; for example orchestra can be rearranged into carthorse.

易位构词是一类文字游戏(更准确地说是一类“词语游戏”),是将组成一个词或短句的字母重新排列顺序,原文中所有字母的每次出现都被使用一次,这样构造出另外一些新的词或短句。

易位构词通常用一种等式的形式来表示,用等号“=”分开原文和变换后的结果,例如用这种形式表示的一个简单的易位变换是“earth = heart”。在一种更高级、更微妙的易位构词游戏的形式中,游戏目标是“发现”一个能用一种幽默或讽刺的方式定义或解释原词语的、且具有语言上的含义(即语言上可理解)的结果,例如“Roll in the hay = Thrill a honey”(由 Tony Crafter 发现)。在原词可以和变化的结果连成一个完整句子时,就用波浪线“~”代替等号把它们连起来,例如“Semolina
~ is no meal.”

private static String sort(String b) {
char[] strArr = b.toCharArray();
int len = strArr.length;
char tmp;
for (int i = 0; i < len; i++) {
for (int j = 1; j < len - i; j++) {
if (strArr[j] > strArr[j - 1]) {
tmp = strArr[j];
strArr[j] = strArr[j - 1];
strArr[j - 1] = tmp;
}
}
}
return String.valueOf(strArr);
}

public static boolean isAnagram(String a, String b) {
if (a == null || b == null) {
return false;
}
String aR = a.replaceAll(" ", "");
String bR = b.replaceAll(" ", "");

return sort(aR).equals(sort(bR));
}

junit testcase

@Test
public void testIsAnagram() {
System.out.println("isAnagram");
assertEquals(true, q1_4.isAnagram("abc", "cba"));
assertEquals(true, q1_4.isAnagram("abc", "abc"));
assertEquals(false, q1_4.isAnagram("abc", "abca"));
assertEquals(false, q1_4.isAnagram(null, null));
assertEquals(true, q1_4.isAnagram("abc 123", "123 abc"));
assertEquals(true, q1_4.isAnagram(" 1 ", "1"));
}

2,使用计数数组,记录第一个字符串中每个字符出现的次数,遍历第二个字符串,对应计数数组-1,最后遍历计数数组,如果存在不为0即不是变位词

public static boolean isAnagram2(String a, String b) {
if (a == null || b == null) {
return false;
}
String aR = a.replaceAll(" ", "");
String bR = b.replaceAll(" ", "");

char[] aArr = aR.toCharArray();
char[] bArr = bR.toCharArray();
int[] flag = new int[256];

for (char c : aArr) {
flag[c]++;
}

for (char c : bArr) {
flag[c]--;
}

for (int i : flag) {
if (i != 0) {
return false;
}
}
return true;
}

junit testcase

@Test
public void testIsAnagram2() {
System.out.println("isAnagram2");
assertEquals(true, q1_4.isAnagram2("abc", "cba"));
assertEquals(true, q1_4.isAnagram2("abc", "abc"));
assertEquals(false, q1_4.isAnagram2("abc", "abca"));
assertEquals(false, q1_4.isAnagram2(null, null));
assertEquals(true, q1_4.isAnagram2("abc 123", "123 abc"));
assertEquals(true, q1_4.isAnagram2(" 1 ", "1"));
assertEquals(false, q1_4.isAnagram2("aaaaaaaaaaaaaaaaa", "aaaaaaa"));
assertEquals(true, q1_4.isAnagram2("aaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaa"));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息