给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
方法一:首先写一个函数判定是否为异位词,然后将是异位词的字符串采用遍历的方法组合在一起,这种方法时间复杂度较高;
bool compareStrings(string str_1, string str_2)
{
string str1 = str_1;
string str2 = str_2;
if (str1.size() != str2.size()) return false;
for (int i = 0; i < str1.size(); i++)
{
int pos = str2.find(str1[i]);
if (pos == -1)
{
return false;
}
else
{
str2.erase(pos,1);
}
}
return true;
}
vector<vector<string>> groupAnagrams_(vector<string>& strs)
{
vector<vector<string>> m_vecOutput;
bool m_bSameTig = false;
for (int i = 0; i < strs.size(); i++)
{
for (int j = 0; j < m_vecOutput.size(); j++)
{
m_bSameTig = compareStrings(strs[i], m_vecOutput[j][0]);
if (m_bSameTig)
{
m_vecOutput[j].push_back(strs[i]);
break;
}
}
if (!m_bSameTig)
{
vector<string> m_vecTemp;
m_vecTemp.push_back(strs[i]);
m_vecOutput.push_back(m_vecTemp);
}
m_bSameTig = false;
}
return m_vecOutput;
}
方法二:哈希表法
关键点:
- 标准库中sort可以对字符串中的字符进行排序生成有序的字符串;
- 查找字符串是否相同,采用哈希表方法时间复杂度为O(1),哈希表key值为有序字符串,value值为存储索引。
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
vector<vector<string>> m_vecOutput;
int m_iIndex = 0;
unordered_map<string, int> m_hashStrs;
for (int i = 0; i < strs.size(); i++)
{
string m_strTemp = strs[i];
sort(m_strTemp.begin(), m_strTemp.end());
if (m_hashStrs.count(m_strTemp))
{
m_vecOutput[m_hashStrs[m_strTemp]].push_back(strs[i]);
}
else
{
vector<string> m_vecTemp;
m_vecTemp.push_back(strs[i]);
m_vecOutput.push_back(m_vecTemp);
m_hashStrs[m_strTemp] = m_iIndex++;
}
}
return m_vecOutput;
}