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 去记录字符的次数之前也有遇到过,很常用。利用质数相乘,是真的太强了。

相关文章
|
10月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
94 0
|
10月前
|
消息中间件 Kubernetes NoSQL
LeetCode 3、28、1351
LeetCode 3、28、1351
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
64 0
LeetCode 354. Russian Doll Envelopes
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
90 0
LeetCode 354. Russian Doll Envelopes
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
140 0
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
125 0
leetcode第56题
leetcode第33题
问题出在,当数组剩偶数长度的时候,mid = (start + end)/ 2,mid 取的是左端点。上图的例子, mid > end, 更新 start = mid,start 位置并不会变化。那么下一次 mid 的值也不会变,就死循环了。所以,我们要更新 start = mid + 1。 综上,找最小值的下标的代码就出来了,同时,由于我们找的是位置 0 对应的下标,所以偏移就是最小值的下标.
101 0
leetcode第33题
leetcode第31题
我们想几个问题。 要想使得数字变大,只要任意一位变大就可以。 要想得到刚好大于原来的数字,要变个位。 这里变大数字,只能利用交换。 如果从个位开始,从右往左进行,找一个比个位大的,交换过来,个位的数字交换到了更高位,由于个位的数字较小,所以交换过去虽然个位变大了,但数字整体变小了。例如 1 3 2,把 2 和 3 交换,变成 1 2 3,个位变大了,但整体数字变小了。 个位不行,我们再看十位,如果从十位左边找一个更大的数字交换过来,和个位的情况是一样的,数字会变小。例如 4 1 2 3,把 2 和 4 交换,2 1 4 3,数字会变小。如果从
108 0
leetcode第31题
leetcode第14题
我们把原来的数组分成两部分,求出左半部分的最长公共前缀,求出右半部分的最长公共前缀,然后求出的两个结果再求最长公共前缀,就是最后的结果了。 求左半部分的最长公共前缀,我们可以继续把它分成两部分,按照上边的思路接着求。然后一直分成两部分,递归下去。 直到该部分只有 1 个字符串,那么最长公共子串就是它本身了,直接返回就可以了。
leetcode第14题