问题1
/*
* 由颠倒字母顺序而构成的词 Anagrams
*例如:输入Eat 和 Tea,输出true
*要求:输入两个单词,判断是否为Anagrams
*思路:将单词排序,若相等,则符合要求
*/
代码:
bool IsAnagrams(const string& s1, const string& s2)
{
if (s1.size() != s2.size())
return false;
string str1(s1);
string str2(s2);
for (size_t i = 0; i < s1.size(); ++i)//把字母转化为小写
{
if (str1[i] >= 'A' && str1[i] <= 'Z')
str1[i] += 32;
if (str2[i] >= 'A' && str2[i] <= 'Z')
str2[i] += 32;
}
sort(str1.begin(),str1.end());
sort(str2.begin(),str2.end());
if (str1 == str2)
return true;
else
return false;
}
问题2:
/*
*由颠倒字母顺序而构成的词 Anagrams
*要求:判断一组字符串数组中的Anagrams
*例如:输入 [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
* 输出[
* [“ate”, “eat”,”tea”],
* [“nat”,”tan”],
* [“bat”]
* ]
*思路:输出的数组都是字典顺序,因此先需要排序
* 利用哈希思想,以Anagrams字典顺序的第一个单词为key值,
* 把同类Anagrams存储到哈希表
* 用哈希表构建二维数组
*/
代码:
vector<vector<string> > groupAnagrams(vector<string>& strs)
{
if (strs.empty())
return vector<vector<string> >();
int len = strs.size();
//将字符串按照字典顺序排序
sort(strs.begin(),strs.end());
vector<vector<string> > ret;
//利用哈希思想构建map,将string 相等的字符串存储在相应的map
map<string, vector<string> > mp;
for (int i = 0; i < len; ++i)
{
string s = strs[i];
sort(s.begin(),s.end());
mp[s].push_back(strs[i]);
}
for (map<string, vector<string> >::iterator it = mp.begin(); it != mp.end();++it)
ret.push_back(it->second);
return ret;
}