今天是我进入算法学习的第一天,我将以算法题驱动的形式来学习,方便以后复习
题目一(*)
解法一(用sort算法,来将字符进行排序,若排序后字符串相等则为字母异位词)
bool isAnagram(string s,string t)
{
if(s.length() != t.length())
return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
解法二(使用hash表,这里我们使用map类)
bool isAnagramHash(string s,string t)
{
map<char,int> _charmap;
for(int i=0;i<s.size();i++)
{
_charmap[s[i]]++;
}
for(int i=0;i<t.size();i++)
{
_charmap[t[i]]--;
}
map<char,int>::iterator iter;
for(iter=_charmap.begin();iter!= _charmap.end();iter++)
{
if(iter->second !=0)
return false;
}
return true;
}
解法三(和解法二类似)
为了检查 t是否是 s的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 S和 T 都只包含 A-Z 的字母,所以一个简单的 26 位计数器表就足够了。
我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个计数器表计算 s 字母的频率,用 t减少计数器表中的每个字母的计数器,然后检查计数器是否回到零。
bool isAnagramArray(string s,string t)
{
if(s.length() != t.length())
return false;
vector<int> counter(26);//初始化
for(int i=0;i<s.length();i++)
{
counter[s[i]-'a']++;
counter[t[i]-'a']--;
}
for(auto count : counter)
if(count!=0)
return false;
return true;
}
题目二(***)
1.使用map(C++map是红黑树来实现的,使用unordered_map效率更高)
2.排序sort,然后检测是否在map中如果在找到对应下标,放入vector中,不存在则创建新的vector,并在健中保留其下标
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> result;
int index=0;
string temp;
unordered_map<string,int> _mapStr;
for(auto each : strs)
{
temp = each;
sort(temp.begin(),temp.end());
if(_mapStr.count(temp))
{
result[_mapStr[temp]].push_back(each);
}else
{
vector<string> str(1,each);
result.push_back(str);
_mapStr[temp]=index++;
}
}
return result;
}
这两个题类似,用排列和hash table