[LeetCode]: 242: Valid Anagram

题目:

思路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:

  1. 利用题目中只会出现小写字母,可以使用一个26位的int数组,分别表示a~z的出现的次数;

  2. 先计算s中字符出现的次数,

  3. 然后遍历t,并减少该字符出现的次数;如果遇到某个字符,其出现次数已经被减到了0,那么该字符是在t中多出现了一次,返回false即可;

  4. 遍历完t,再检查一遍是否有字符的出现次数没有被减到0的情况;如果存在,说明该字符在s中出现的次数比在t中多;返回false;

  5. 最后返回true即可;

  6. 时间复杂度为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;
        
    }
原文地址:https://www.cnblogs.com/savageclc26/p/4857032.html