题目
原文:
Write a method to decide if two strings are anagrams or not.
译文:
写一个方法判断两个字符串是否是变位词而成的。
解答
所谓变位词(anagrams)就是字符串的组成的字符都是一样,只是位置不同而已,如:abcdd和dabdc就是一组变位词。
方法1:
将两个字符串重新按照ascii值顺序排列,在比较是否相同即可,如下:
public static boolean isAnagrams(String str1,String str2){
if(str1.length()!=str2.length())
return false;
return change(str1).equals(change(str2));
}
public static String change(String str){
char[] arr=str.toCharArray();
qsort(arr,0,str.length()-1);
return new String(arr);
}
public static void qsort(char[] s,int l,int r){
int i,j;
char x;
if(l<r){
i=l;
j=r;
x=s[i];
while(i<j){
while(i<j&&s[j]<x) j--;
if(i<j) s[i++]=s[j];
while(i<j&&s[i]>x) i++;
if(i<j) s[j--]=s[i];
}
s[i]=x;
qsort(s,l,i-1);
qsort(s,i+1,r);
}
}
方法2:
开一个大小为256的整型数组统计每个字符出现的次数,第一个字符串的字符出现就加一,另一个的则减一,最后判断该整型数组每个值是否都为0,若为0,则是变位词,否则不是,如下:
public static boolean isAnagrams2(String str1,String str2){
if(str1.length()!=str2.length())
return false;
int[] t=new int[256]; //初始化默认为0
for(int i=0;i<str1.length();i++){
++t[(int)str1.charAt(i)];
--t[(int)str2.charAt(i)];
}
for(int i=0;i<t.length;i++){
if(t[i]!=0)
return false;
}
return true;
}
完整代码:
class Q1_4{
public static boolean isAnagrams(String str1,String str2){
if(str1.length()!=str2.length())
return false;
return change(str1).equals(change(str2));
}
public static String change(String str){
char[] arr=str.toCharArray();
qsort(arr,0,str.length()-1);
return new String(arr);
}
public static void qsort(char[] s,int l,int r){
int i,j;
char x;
if(l<r){
i=l;
j=r;
x=s[i];
while(i<j){
while(i<j&&s[j]<x) j--;
if(i<j) s[i++]=s[j];
while(i<j&&s[i]>x) i++;
if(i<j) s[j--]=s[i];
}
s[i]=x;
qsort(s,l,i-1);
qsort(s,i+1,r);
}
}
//方法二
public static boolean isAnagrams2(String str1,String str2){
if(str1.length()!=str2.length())
return false;
int[] t=new int[256]; //初始化默认为0
for(int i=0;i<str1.length();i++){
++t[(int)str1.charAt(i)];
--t[(int)str2.charAt(i)];
}
for(int i=0;i<t.length;i++){
if(t[i]!=0)
return false;
}
return true;
}
public static void main(String[] args){
String str1="abcdd";
String str2="dabdc";
System.out.println(isAnagrams(str1,str2));
System.out.println(isAnagrams2(str1,str2));
}
}
此题若有更好的方法,还望交流!
---EOF---