变形词:
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1和str2互为变形词。
我自己的愚蠢实现:
package algorithm_database;
public class IsBianxingci {
public static void main(String[] args){
String a = "123";
String b = "321";
System.out.println(bianxingci(a,b));
}
public static boolean bianxingci(String a, String b){
char[] aa = a.toCharArray();
char[] bb = b.toCharArray();
if(aa.length!=bb.length){
return false;
}
int length = aa.length;
for(int i=0;i<length;i++){
boolean isOk = false;
char x = aa[i];
for(int j=0;j<length;j++){
if(bb[j]!='#' && x==bb[j]){
bb[j]='#';
isOk=true;
break;
}
}
if(isOk==false){
return false;
}
}
return true;
}
}
算法时间复杂度:o(n2)
算法空间复杂度:o(n)
算法缺陷:‘#’字符不能出现在做对比的字符串中。
大神的实现:
package algorithm_database;
/
public class IsBianxingci {
public static void main(String[] args){
String a = "123444";
String b = "344421";
System.out.println(bianxingci(a,b));
}
public static boolean bianxingci(String a, String b){
char[] chas1 = a.toCharArray();
char[] chas2 = b.toCharArray();
int[] map = new int[256];
if(chas1.length!=chas2.length){
return false;
}
for(int i=0;i<chas1.length;i++){
map[chas1[i]]++;
}
for(int i=0;i<chas2.length;i++){
if(map[chas2[i]]==0){
return false;
}
map[chas2[i]]--;
}
return true;
}
}
算法时间复杂度:o(n),比我的少了一个数量级
算法空间复杂度:字符种类个数
算法缺陷:上面的算法假设字符串里面的字符的编码值在0~255,不过可以修改。实用哈希表来替换。简单说下思想:定义一个哈希表代替上面的map
int aaaa = '就';
System.out.println(aaaa);
输出为:23601,
总结:
int aaaa = '就';这种写法我没有写过,所有没有采用大神的方法。
当然我的实现也是有点优点的,一般情况下,两个String互为变形词的概率很小,我的程序在某些情况下能提前结束无用的对比。