题目:
思路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
运行结果:算法超时。 原因: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