* 变形词问题
* 变形词,即两个具备相同的字符及数量的串。
* 问题:给定两个字符串,编写程序,肯定其中一种一个字符串的字符从新排列后,可否变成另外一个字符。
* 返回bool,表明两串是否从新排列后能够相同。
* 思路:
* 方法1:将字符串转换成字符数组,而后排序字符数组,利用Arrays的equal功能判断是否相等。
* 方法2:开辟新的辅助空间,即256的整型数组,作计数使用。
* 扫描字符串1,将其中出现的字符转换为ASCII值,对应的辅助数组上+1;
* 扫描字符串2,将其中出现的字符转换为ASCII值,对应的辅助数组上-1;
* 若是作减法以后为负数,直接返回false;
* 扫描辅助数组,有大于0的数值出现,直接返回false数组
1 private static boolean checkSame1(String str1, String str2) { 2 int len1=str1.length(); 3 int len2=str1.length(); 4 if(len1!=len2) 5 return false; 6 char []arr1=str1.toCharArray(); 7 char []arr2=str2.toCharArray(); 8 Arrays.sort(arr1); 9 Arrays.sort(arr2); 10 11 12 return Arrays.equals(arr1, arr2); 13 }
1 private static boolean checkSame2(String str1, String str2) { 2 int len1=str1.length(); 3 int len2=str1.length(); 4 if(len1!=len2) 5 return false; 6 7 int []helper=new int [256]; 8 //将串1的元素对应到辅助数组中; 9 for (int i = 0; i < len1; i++) { 10 char c=str1.charAt(i); 11 helper[c]++; 12 } 13 //将串2的元素在helper的对应位置减掉 14 for (int i = 0; i < len2; i++) { 15 char c=str2.charAt(i); 16 helper[c]--; 17 if(helper[c]<0) 18 return false; 19 } 20 for (int i = 0; i < helper.length; i++) { 21 if(helper[i]>0) 22 return false; 23 return true; 24 } 25 return true; 26 }
1 public static void main(String[] args) { 2 String str1 = "aa bcde fagq"; 3 String str2 = "aa bdce fagy"; 4 boolean res=checkSame2(str1, str2); 5 System.out.println(res); 6 7 }