1. 程式人生 > >[Leetcode] Anagrams 顛倒字母構成詞

[Leetcode] Anagrams 顛倒字母構成詞

++ -c end bsp ngs 數組 blank 如何 puts

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

題意:anagrams的意思是回文構詞法。回文構詞法有一個特點:單詞裏的字母的種類和數目沒有改變,只是改變了字母的排列順序。如:

Input:  ["tea","and","ate","eat","den"]

Output: ["tea","ate","eat"]

思路:因為回文構詞法的單詞之間僅僅是字母改變了順序,那麽我們可以先對單詞進行排序,然後我們就可以通過兩個單詞之間是否相等,來判斷是否為回文構詞法形成的。那麽如何來判斷兩個單詞相等,若是拿某個單詞和之前的逐個進行比較,那麽時間復雜度就很高了,這裏用到map,這樣查找起來就方便多了。那查找之後怎麽辦了?對數組中的每一個字符串:

1)若是在map沒有找到,則,將其下標存入,以供後面的對比;

2)若是找到了,先將之前的那個字符串和目前的這個,存入res中。

針對第二種情況,就存在一個問題了,如何避免已存入的再次存入?我們可以將之前存入的那個在map中對應的值改為-1(小於0即可),然後加一定的條件判斷(若是不加條件判斷,則,改為-1就沒有意義了)。參考了doc_sgl代碼如下:

 1 class Solution {
 2 public:
 3     vector<string> anagrams(vector<string> &strs) 
 4     {
 5         vector<string
> res; 6 7 map<string,int> anagram; 8 9 for(int i=0;i<strs.size();++i) 10 { 11 string s=strs[i]; 12 sort(s.begin(),s.end()); 13 14 if(anagram.find(s)==anagram.end()) 15 anagram[s]=i; 16 else
17 { 18 if(anagram[s]>=0) 19 { 20 res.push_back(strs[anagram[s]]); //存之前 21 anagram[s]=-1; 22 } 23 res.push_back(strs[i]); //存現在 24 } 25 } 26 return res; 27 } 28 };

[Leetcode] Anagrams 顛倒字母構成詞