原文:
Write a method to decide if two strings are anagrams or not.
译文:
写一个函数判断两个字符串是否是变位词。
变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词。
本题使用两种解题方法
package chapter_1_arraysandstring;
/**
* 写一个函数判断两个字符串是否是变位词。 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。 比如说,
* abbcd和abcdb就是一对变位词。
*
* @author LiangGe
*
*/
public class Question_1_4 {
/**
* 通过建立两个数组分别记录每个字符串中每个字符出现的次数
* 最后在遍历数组比较每个字符出现次数是否相同
*
* 时间复杂度 0(n)
*/
public static boolean isAnagrams(String str1, String str2) {
int len1 = str1.length();
int len2 = str2.length();
int count1[] = new int[256];
int count2[] = new int[256];
if (len1 != len2) {
return false;
}
for (int i = 0; i < len1; i++) {
count1[(int) str1.charAt(i)]++;
count1[(int) str2.charAt(i)]++;
}
for (int i = 0; i < len1; i++) {
if (count1[i] != count2[i]) {
return false;
}
}
return true;
}
/**
* 快速排序划分
*/
public static int quickSortPartion(char array[], int start, int end) {
char p = array[start];
while(start < end) {
while(array[end] >= p && start < end)
end --;
if(start < end) {
array[start ++] = array[end];
}
while(array[start] <= p && start < end)
start ++;
if(start < end) {
array[end--] = array[start];
}
}
array[start] = p;
return start;
}
/**
* 快速排序
*/
public static void quickSort(char array[], int start, int end) {
// 防止超出数组边界
if(start < end) {
int partion = quickSortPartion(array, start, end);
quickSort(array, 0, partion-1);
quickSort(array, partion+1, end);
}
}
/**
* 对两个字符串排序,然后如果是变位词则字符串内容相同
* O(nlogn)的时间去排序,然后用O(n)的时间比较它们是否相等即可
*/
public static boolean isAnagrams2(String str1, String str2) {
char array1[] = str1.toCharArray();
char array2[] = str2.toCharArray();
int len1 = array1.length;
int len2 = array2.length;
if(len1 != len2) {
return false;
}
System.out.println("before quicksort str1:" + str1);
System.out.println("before quicksort str1:" + str2);
quickSort(array1, 0, len1-1);
quickSort(array2, 0, len2-1);
System.out.println("after quicksort str1:" + String.valueOf(array1));
System.out.println("after quicksort str1:" + String.valueOf(array2));
for(int i=0; i<len1; i++) {
if(array1[i] != array2[i]) {
return false;
}
}
return true;
}
public static void main(String args[]) {
String str1 = "ca b 1 23aaa";
String str2 = "a b aa c12a3";
System.out.println(isAnagrams(str1, str2));
System.out.println(isAnagrams2(str1, str2));
}
}