算法-有效的字母异位词和字母异位词分组

237 阅读1分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词指字母相同,但排列不同的字符串。

排序,比较


 public boolean isAnagram(String s, String t) {
        //长度不相等,肯定就不是了
        if (s.length() != t.length()) {
            return false;
        }
        //转为char数组
        final char[] sChars = s.toCharArray();
        final char[] tChars = t.toCharArray();

        //排序,异位词经过排序后,结果是一样的
        // 排序的时间复杂度等nlogn
        // O(logn) 的空间复杂度
        Arrays.sort(sChars);
        Arrays.sort(tChars);
        //比较的时间复杂度为n
        return Arrays.equals(sChars, tChars);
    }

复杂度分析

  • 时间复杂度:O(nlogn)O(nlogn)ns的长度。 时间复杂度等于排序时间复杂度O(nlogn)O(nlogn)加上比较时间复杂度O(n)O(n),结果等于O(nlogn)O(nlogn)

  • 空间复杂度:O(logn)O(logn)ns的长度,排序所需的空间。

字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。



        public List<List<String>> groupAnagrams(String[] strs) {
        //key 为排序后异位词, value为对应的数组
        Map<String, List<String>> map = new HashMap<String, List<String>>();

        //遍历
        for (String str : strs) {
            // 转为数组
            char[] array = str.toCharArray();
            //排序,排序好之后,异位词是一样。
            Arrays.sort(array);
            String key = new String(array);
            //保存到map中
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            //排序后的异位词的key是一样的,然后list保存没有排序后的异位词
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }

复杂度分析

  • 时间复杂度:O(nklogk)O(nklogk)ns的长度。排序的时间复杂度为O(klogk)O(klogk),当在for循环中排序,k代表的意思就是字符串最长的长度。

  • 空间复杂度:排序所需的空间+map存储的空间。