code49: Group Anagrams
Given an array of strings, group anagrams together.
Example:
Input: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Output:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
解答:
1 第一想法,dfs类似的暴力破解,一旦出现不对就排除:
def1:比较元素是否相同(非顺序),如果相同则返回true,反之false
def2:选取res数组,以及即将进入的str 通过调用def1进行比较。如果对,则在该分数组内res[i]进行append。否则直接res.append()该[str]。
def3:进行遍历,input遍历对比res数组元素,每次处理完则再进入下一个str
复杂度比较高 接近O(NNK)
代码:
class Solution:
def groupAnagrams(self, strs):
arr = []
for i in range(len(strs)):
arr = self.operate_arr(arr, strs[i])
return arr
def operate_arr(self, arr, input_str):
for i in range(len(arr)):
target = arr[i][0]
res = self.compare(target, input_str)
if res:
arr[i].append(input_str)
return arr
else:
continue
arr.append([input_str])
return arr
def compare(self, b, a):
if len(a) != len(b):
return False
else:
for i in range(len(a)):
num = b.find(a[i])
if num == -1:
return False
else:
b = b[:num] + b[num + 1:]
#print(num,b)
return True
理论上是没问题的,但是由于时间复杂度高,最后TLE了。
改进:
将str进行自身排序以后,进入hashtable比较。
如果存在于hahtable,则在相应的res[i]处append。
如果不存在,则直接res.append。
这里使用一个 数组与字符串变化的方法:
''.join(sorted(str_in))
sorted将str_in变为数组,然后使用join再链接为字符串
代码:
class Solution:
def groupAnagrams(self, strs):
temp = {}
res = []
count = -1
for i in range(len(strs)):
e = ''.join(sorted(strs[i]))
if e in temp.keys():
x = temp[e]
res[x].append(strs[i])
else:
count += 1
temp[e] = count
res.append([strs[i]])
return res
tips:
1 字符串变数组:
list(in_str)
in_str.split(’ ‘)
in_str.split(’.’)
2 数组变字符串
‘’.join(arr)
’ '.join(arr)
‘.’.join(arr)
3 str一旦确定无法使用s[i]=xxx进行修改
4 二维数组(非numpy)无法进行列的切片。