文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k
文章目录
题目描述
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
java实现方法1:
/**
* 生成镶嵌链表
*
* @param strs 字符串数组
* @return 链表
*/
private List<List<String>> groupAnagrams1(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
String newStr = getSortedStr(str);
if (!map.containsKey(newStr)) {
map.put(newStr, new ArrayList<>());
}
map.get(newStr).add(str);
}
return new ArrayList<>(map.values());
}
/**
* 字符串进行排序
*
* @param s 字符串
* @return 排序好的字符串
*/
public String getSortedStr(String s) {
char chs[] = s.toCharArray();
Arrays.sort(chs);
return new String(chs);
}
时间复杂度:O(n)
空间复杂度:O(n)
python的实现方式1:
def group_anagrams1(self, arr: List[str]) -> List[str]:
'''
字符串
Args:
strs: 字符串数组
Returns:
链表
'''
dic = {}
for ele in arr:
sorted_str = self.get_sort_str(ele)
if sorted_str not in dic:
dic[sorted_str] = []
dic[sorted_str].append(ele)
return list(dic.values())
def get_sort_str(self, s: str) -> str:
'''
对字符串进行排序
Args:
s: 字符串
Returns:
排序后字符串
'''
s = sorted(list(s))
return ''.join(s)
时间复杂度:O(n)
空间复杂度:O(n)
java实现方法2:
/**
* 生成镶嵌链表
*
* @param strs 字符串数组
* @return 链表
*/
private List<List<String>> groupAnagrams2(String[] strs) {
int[] prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};//最多10609个z
List<List<String>> res = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (String s : strs) {
int key = 1;
for (char c : s.toCharArray()) {
key *= prime[c - 'a'];
}
List<String> t;
if (map.containsKey(key)) {
t = res.get(map.get(key));
} else {
t = new ArrayList<>();
res.add(t);
map.put(key, res.size() - 1);
}
t.add(s);
}
return res;
}
时间复杂度:O(n)
空间复杂度:O(n)
python实现方法2:
def group_anagrams2(self, strs: List[str]) -> List[str]:
'''
字符串
Args:
strs: 字符串数组
Returns:
链表
'''
dic = {}
for str in strs:
key = self.invert_to_num(str)
if key not in dic:
dic[key] = []
dic[key].append(str)
return list(dic.values())
def invert_to_num(self, s: str) -> int:
'''
将字符串转成素数
Args:
s:将字符串转成数字
Returns:
质数
'''
# 26个字母,定义26个素数
prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103]
key = 1
for ch in s:
key *= prime[ord(ch) - ord('a')]
return key
时间复杂度:O(n)
空间复杂度:O(n)