题目:
思路1:
遍历参考的字符S,从中取出一个字符
在需要检查的字符T中,使用indexof来得出位置
如果结果为-1 则直接返回false
如果结果为1,则将该字符从T中删除
代码:
public static boolean isAnagram(String s, String t) { if(s.length() != t.length()){ return false; } if(s == t){ return true; } for(int i = 0 ;i<s.length();i++){ String charTemp = s.substring(i,i+1); //System.out.println("**************************************"); //System.out.println("本次检测的字符:" +charTemp ); int intPosition = t.indexOf(charTemp); if(intPosition == -1){ //System.out.println("存在没有的字符"); return false; } else{ int intLengthTemp = t.length(); //System.out.println("重复字符:" + t.substring(intPosition,intPosition+1) + " 重复字符出现的位置:" + intPosition); t = t.substring(0,intPosition) + t.substring(intPosition+1,intLengthTemp); //System.out.println("移除后的t:" + t); } } if(t.equals("")){ return true; } else{ //System.out.println("同一个字符出现的个数不对 :" + t ); return false; } }
运行结果:算法超时。 原因:indexOf的算法应该也是循环遍历,我的算法相当于在循环遍历中嵌入了循环,导致算法超时
网上牛人的思路1:使用java内置的方法将字符串转成数组,然后对数组排序,排序后的结果再比较
代码:
public static boolean isAnagram(String s, String t) { char[] arrS = s.toCharArray(); char[] arrT = t.toCharArray(); Arrays.sort(arrS); Arrays.sort(arrT); return String.valueOf(arrS).equals(String.valueOf(arrT)); }
网上牛人的思路2:
-
利用题目中只会出现小写字母,可以使用一个26位的int数组,分别表示a~z的出现的次数;
-
先计算s中字符出现的次数,
-
然后遍历t,并减少该字符出现的次数;如果遇到某个字符,其出现次数已经被减到了0,那么该字符是在t中多出现了一次,返回false即可;
-
遍历完t,再检查一遍是否有字符的出现次数没有被减到0的情况;如果存在,说明该字符在s中出现的次数比在t中多;返回false;
-
最后返回true即可;
-
时间复杂度为o(n), 空间复杂度为常量;
代码:
public static boolean isAnagram(String s, String t) { int[] arrCharacterCount = new int[26]; char[] arrS = s.toCharArray(); char[] arrT = t.toCharArray(); for(int i =0;i<arrS.length;i++){ arrCharacterCount[arrS[i]-'a']++; } for(int i =0;i<arrT.length;i++){ arrCharacterCount[arrT[i]-'a']--; } for(int i =0;i<arrCharacterCount.length;i++){ if(arrCharacterCount[i] != 0){ return false; } } return true; }