原題是這樣的: 給出一個字元串數組S,找到其中所有的亂序字元串(Anagram)。如果一個字元串是亂序字元串,那麼他存在一個字母集合相同,但順序不同的字元串也在S中。 樣例 對於字元串數組 ["lint","intl","inlt","code"] 返回 ["lint","inlt","intl"] ...
原題是這樣的:
給出一個字元串數組S,找到其中所有的亂序字元串(Anagram)。如果一個字元串是亂序字元串,那麼他存在一個字母集合相同,但順序不同的字元串也在S中。
樣例
對於字元串數組 ["lint","intl","inlt","code"]
返回 ["lint","inlt","intl"]
剛開始的想法是,使用dict字典才記錄,字母,可是這樣會需要很多的字典,並且處理起來不方便。後來就想到了給字元排序
原理很簡單,給上面的字元排序,就像西面的這個過程
1 s = "adceb" 2 l = list(s) 3 l.sort() 4 s1 = "".join(l)
通過這一步的處理之後,可以看到s1為 "abcde"
那麼我們對傳進來的數組中的所有元素,進行這個排序。因為我們按照特定的排序方式進行排序,必然會導致一樣的排序結果。那麼只要排序後的字元串是一致的,那麼我們就可以肯定這幾個字元串是相同的字元串
那麼,下麵直接上代碼
1 class Solution: 2 """ 3 @param: strs: A list of strings 4 @return: A list of strings 5 """ 6 def anagrams(self, strs): 7 # write your code here 8 if strs == None and strs == []: 9 return strs 10 if len(strs) == 1: 11 return strs 12 13 returnlist = [] 14 templist = {} 15 for i in range(len(strs)): 16 if strs[i] == None and strs[i] == "": 17 continue 18 s = strs[i] 19 s1="".join((lambda x:(x.sort(),x)[1])(list(s))) #這一句是百度出來的,但是也不難理解,將s的list傳入,排序後,返回x 20 if s1 in templist: 21 templist[s1].append(i) 22 if s1 not in templist: 23 templist[s1] = [i] 24 25 for k in templist.keys(): 26 if len(templist.get(k)) > 1: 27 for i in templist.get(k): 28 returnlist.append(strs[i]) 29 return returnlist
ok done,如果有更好的演算法,也請分享給我。謝謝!