您的位置:首页 > 其它

Cracking the coding interview--Q1.4

2014-10-20 15:13 351 查看
原文:

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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法