leetcode第49题

简介: 时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。空间复杂度:O(NK),用来存储结果。解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。

image.png

给定多个字符串,然后把它们分类。只要字符串所包含的字符完全一样就算作一类,不考虑顺序。

解法一

最通用的一种解法,对于每个字符串,比较它们的每个字符出现的个数是否相等,相等的话就把它们放在一个 list 中去,作为一个类别。最外层写一个 for 循环然后一一比较就可以,还可以用一个等大的布尔型数组来记录当前字符串是否已经加入的了 list 。比较两个字符串的字符出现的次数可以用一个 HashMap,具体看代码吧。

publicList<List<String>>groupAnagrams(String[] strs) {
List<List<String>>ans=newArrayList<>();
boolean[] used=newboolean[strs.length];
for (inti=0; i<strs.length; i++) {
List<String>temp=null;
if (!used[i]) {
temp=newArrayList<String>();
temp.add(strs[i]);
//两两比较判断字符串是否符合for (intj=i+1; j<strs.length; j++) {
if (equals(strs[i], strs[j])) {
used[j] =true;
temp.add(strs[j]);
                }
            }
        }
if (temp!=null) {
ans.add(temp);
        }
    }
returnans;
}
privatebooleanequals(Stringstring1, Stringstring2) {
Map<Character, Integer>hash=newHashMap<>();
//记录第一个字符串每个字符出现的次数,进行累加for (inti=0; i<string1.length(); i++) {
if (hash.containsKey(string1.charAt(i))) {
hash.put(string1.charAt(i), hash.get(string1.charAt(i)) +1);
        } else {
hash.put(string1.charAt(i), 1);
        }
    }
//记录第一个字符串每个字符出现的次数,将之前的每次减 1for (inti=0; i<string2.length(); i++) {
if (hash.containsKey(string2.charAt(i))) {
hash.put(string2.charAt(i), hash.get(string2.charAt(i)) -1);
        } else {
returnfalse;
        }
    }
//判断每个字符的次数是不是 0 ,不是的话直接返回 falseSet<Character>set=hash.keySet();
for (charc : set) {
if (hash.get(c) !=0) {
returnfalse;
        }
    }
returntrue;
}

时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。

空间复杂度:O(NK),用来存储结果。

解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。

下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。


image.png

利用 HashMap 去记录字符的次数之前也有遇到过,很常用。利用质数相乘,是真的太强了。

相关文章
|
8月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
36 0
|
8月前
leetcode-1447:最简分数
leetcode-1447:最简分数
50 0
|
8月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
84 0
单链表反转 LeetCode 206
单链表反转 LeetCode 206
82 0
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
94 0
LeetCode 66. Plus One
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
114 0
leetcode第42题
leetcode第54题
在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。
110 0
leetcode第54题
|
算法
leetcode第32题
这几种算法,暴力破解和动态规划我觉得想的话,还是能分析出来的话,最后两种算法感觉是去挖掘题的本质得到的算法,普适性不是很强。但最后一种算法,从左到右,从右到左,是真的强。
110 0
leetcode第32题
leetcode第23题
时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)。 空间复杂度:新建了一个链表,O(N)。
leetcode第23题
|
机器学习/深度学习 算法
leetcode第15题
参考了这里-Java-solution) 主要思想是,遍历数组,用 0 减去当前的数,作为 sum ,然后再找两个数使得和为 sum。 这样看来遍历需要 O(n),再找两个数需要 O(n²)的复杂度,还是需要 O(n³)。 巧妙之处在于怎么找另外两个数。 最最优美的地方就是,首先将给定的 num 排序。 这样我们就可以用两个指针,一个指向头,一个指向尾,去找这两个数字,这样的话,找另外两个数时间复杂度就会从 O(n²),降到 O(n)。 而怎么保证不加入重复的 list 呢? 要记得我们的 nums 已经有序了,所以只需要找到一组之后,当前指针要移到和当前元素不同的地方。其次在遍
133 0
leetcode第15题