初入算法(一)

今天是我进入算法学习的第一天,我将以算法题驱动的形式来学习,方便以后复习

题目一(*)

在这里插入图片描述

解法一(用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

发布了17 篇原创文章 · 获赞 3 · 访问量 416

猜你喜欢

转载自blog.csdn.net/qq_41172631/article/details/105106834