• [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;
            
        }
  • 相关阅读:
    队列
    使用JPype实现Python调用JAVA程序
    Django和Flask对于URL尾斜杠(back slash)的处理
    数据仓库建设中的数据建模方法(转)
    python自定义logger handler
    Eclipse下.project和.classpath作用(转)
    理解python的with语句
    django常见小问题收集(转)
    windows下无法创建django工程的问题
    Excel的python读写
  • 原文地址:https://www.cnblogs.com/savageclc26/p/4857032.html
Copyright © 2020-2023  润新知