题目:
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
代码:
import java.util.Arrays;
/*
变形词:两个串有相同的字符及数量组成 abc abc ,abc cba,aabcd bcada;
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
* 这里规定大小写为不同字符,且考虑字符串中的空格。保证两串的长度都小于等于5000。
测试样例:
"Here you are","Are you here"
返回:false
*/
public class Same {
public static void main(String[] args) {
String A = "abcdd";
String B = "cbaddd";
System.out.println("解法一:"+checkSam_1(A, B));
System.out.println("解法二:"+checkSam_2(A, B));
}
/**
* 解法一、时间复杂度为O(NlgN)
*/
public static boolean checkSam_1(String stringA, String stringB) {
int len1 = stringA.length();
int len2 = stringB.length();
if (len1 != len2) {
return false;
}
// 转成字符数组
char[] arr1 = stringA.toCharArray();
char[] arr2 = stringB.toCharArray();
// 对它们排序
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1, arr2);
}
/**
* 解法二、时间复杂度为 O(N)
*/
static boolean checkSam_2(String stringA,String stringB){
int []helper = new int[128]; // 这里有一个巧妙解法 只用一个辅助空间
char[] charArrA = stringA.toCharArray();
char[] charArrB = stringB.toCharArray();
for (int i = 0; i < charArrA.length; i++) {
helper[charArrA[i]]++;
}
for (int i = 0; i < charArrB.length; i++) {
helper[charArrB[i]]--;
if (helper[charArrB[i]]<0) { // B 比 A 多 在辅助空间相同位置上
return false;
}
}
for (int i = 0; i < helper.length; i++) {
if(helper[i]>0){ // A 比 B 多 在辅助空间相同位置上
return false;
}
}
return true;
}
}