問題描述如下:
給出一個字符串數組S,找到其中所有的亂序字符串(Anagram)。如果一個字符串是亂序字符串,那么他存在一個字母集合相同,但順序不同的字符串也在S中。
image.png
問題分析:
對于一個字符串,我們利用函數str2label(string str) 將其轉化為“一個標簽”。比如說“apple”變為“a1e1p2l1”這樣的標簽。對于亂序的字符串最終都會變為同一個標簽。然后再利用map結構進行鍵值對的查找。
#include<vector>
#include<iostream>
#include<string>
#include<map>
using namespace std;
//給出一個字符串數組S,找到其中所有的亂序字符串(Anagram)。
//如果一個字符串是亂序字符串,那么他存在一個字母集合相同,
//但順序不同的字符串也在S中。
class Solution {
public:
/**
* @param strs: A list of strings
* @return: A list of strings
*/
string str2label(string str)
{
if(str=="") return str;//特殊情況考慮
int hashtable[26]={0};
for(int i=0;i<str.size();i++)
{
int index=str[i]-'a';
hashtable[index]++;
}
string res;
for(int i=0;i<26;i++)
{
if(hashtable[i]==0) continue;
else
{
res.push_back(char('a'+i));
res.push_back(char(hashtable[i])+'0');//如何將int變為char
}
}
return res;
}
vector<string> anagrams(vector<string> &strs) {
// write your code here
map<string,vector<string>>m;//這里map鍵值對的設置很關鍵
vector<string> result;
for(int i=0;i<strs.size();i++)
{
string str=str2label(strs[i]);
auto it=m.find(str);
if(it==m.end()) {
vector<string> res;
res.push_back(strs[i]);
m.insert(pair<string,vector<string> >(str,res));
}
else
{
it->second.push_back(strs[i]);
}
}
for(auto it=m.begin();it!=m.end();it++)
{
if(it->second.size()>1){
for(auto ite=it->second.begin();ite!=it->second.end();ite++)
result.push_back(*ite);
}
}
return result;
}
};