[Leetcode] Anagrams 顛倒字母構成詞
阿新 • • 發佈:2017-06-25
++ -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 else17 { 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 顛倒字母構成詞