LeetCode Anagrams

2014-11-24 07:56:26 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 1

Anagrams

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

Note: All inputs will be in lower-case.

±¾Ìâ×îÇÉÃîµÄ˼Ï룺

ÒòΪËùνµÄanagramÊÇ×Ö·ûλÖò»Ò»Ñù£¬×Ö·û´®ÊÇÒ»ÑùµÄ£¬ÄÇô¾Í°Ñ¸Ã×Ö·ûÅÅÐòÖ®ºó×÷ΪmapµÄ¹Ø¼ü×Ö¡£

ÅÅÐòÖ®ºó×÷Ϊ¹Ø¼ü×Ö-¾ø£¡

vector
  
    anagrams(vector
   
     &strs) { vector
    
      vst; if (strs.size() < 2) return vst; map
     
       > msvs; for (int i = 0; i < strs.size(); i++) { string s = strs[i]; sort(s.begin(), s.end());//¾«»ª£¬×îÇÉÃîµÄµØ·½£ºÅÅÐòºó×÷ΪmapµÄ¹Ø¼ü×Ö¡£»Æ¾îÓ׸¾ÍâË msvs[s].push_back(strs[i]); } for (auto it:msvs) { if (it.second.size() > 1) vst.insert(vst.end(),it.second.begin(), it.second.end()); } return vst; }
     
    
   
  


ÏÂÃæÒ²ÊÇhash˼ÏëдµÄ³ÌÐò£¬³ÌÐòÓ¦¸ÃÕýÈ·ÁË£¬¿Éϧ³¬Ê±¡£»¹ÊÇÐèÒªÏñÉÏÃæÄÇÑù½øÒ»²½ÓÅ»¯¡£

vector
  
    anagrams(vector
   
     &strs) { vector
    
      vst; if (strs.size() < 2) return vst; vector
     
       v1, v2; int n = strs.size(); for (int i = 0; i < n; i++) { bool flag = false; vst.push_back(strs[i]); v1.clear(); v1.resize(26,0); for (int k = 0; k < strs[i].length(); k++) { v1[strs[i][k]-'a']++; } for (int j = i+1; j < n; j++) { if (strs[i] == strs[j]) continue; v2.clear(); v2.resize(26,0); for (int k = 0; k < strs[j].length(); k++) { v2[strs[j][k]-'a']++; } if (v1 == v2) { vst.push_back(strs[j]); strs.erase(strs.begin()+j); n--; flag = true; } } if (!flag) vst.pop_back(); } return vst; }