49.题字母异位词分组
难度:中等
问题描述:
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
分析:
字母异位词,具有相同的字母,但位置不同,说它们具有相同的特征,好象有,因为具有相同的字母,但又不便于从程序上直接统计,因为字母的位置毕竟不相同,程序只能统计完全相同的内容,所以要进行转化,将它们转化为便于统计的形式。具体做法是将每个单词拆分成字母,并排序,这样异位词就有了相同的形式,具有共同的特征。
程序如下:
#处理函数,将一个字符串列表中的每一项处理成排序了的字符列表
def chuli(mystr):
return list(map(sorted,list(map(list,mystr))))
#将列表中重复项去掉,,注意在这里不能使用list(set(b))的方式去重
def quchong(b):
c=[]
for i in b:
if i in c:
continue
else:
c.append(i)
return c
#输入字符串列表
strs=eval(input('pls input strs='))
b=chuli(strs)
c=quchong(b)
d=[] #用于保存处理结果
#用去重之后的c列表项在没有去重的b列表中查找
#如果只有一项直接添加到结果d中,否则将异位词组成子列表e添加到结果列表d中
for i in c:
if b.count(i)==1:
d.append([strs[b.index(i)]])
else:
e=[]
k=0
for j in range(b.count(i)):
m=b.index(i,k)
e.append(strs[m])
k=m+1
d.append(e)
#输出处理结果
print(d)
运行实例1:
pls input strs=["eat", "tea", "tan", "ate", "nat", "bat"]
[['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]
运行实例2:
pls input strs=['abc','bcd','cba']
[['abc', 'cba'], ['bcd']]
感悟:
没有共同点,要找出它们的共同点,这就有了处理。
要善于通过映射,建立由此及彼的联系。