给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

解决问题: 一开始我想到的是拆分成数组再排序,最后比较就行,但是这样时间很长,要将近40ms
        char[] s1=s.toCharArray();
        List<Character> x=new ArrayList<>();
        for (char c : s1) {
            x.add(c);
        }
        x.sort((o1,o2)->o1.charValue()-o2.charValue());

        char[] s2=t.toCharArray();
        List<Character> y=new ArrayList<>();
        for (char c : s2) {
            y.add(c);
        }
        y.sort((o1,o2)->o1.charValue()-o2.charValue());

        if(x.size()!=y.size()){
            return false;
        }
        for (int i = 0; i < x.size(); i++) {
            if(x.get(i)!=y.get(i)){
                return false;
            }
        }
        return true;
参考代码将该问题转换为比较字符串中字母出现次数问题,并只需要在扫描s时在26位数组中记录出现次数,然后扫描t时减去相应的次数,最后检测数组是否全为零就可以完美解决,只用了3ms
public boolean isAnagram(String s, String t) {
        int[] hash=new int[26];
        for (int i = 0; i < s.length(); i++) {
            hash[s.charAt(i)-'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            hash[t.charAt(i)-'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if(hash[i]!=0){
                return false;
            }
        }
        return true;

    }

健身的墨镜
1 声望0 粉丝

下一篇 »
454.四数相加