题目
原文:
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---