leetcode 383. 赎金信

赎金信

题目

leetcode 383. 赎金信_第1张图片

解题思路

第一个数组中的元素要求由第二个数组中的元素构成,且不重复,那么第一个数组的长度是必定要不大于第二个数组的长度。这一点就可以作为一个判断条件。
其次,我们需要统计每个字母出现的个数,很容易想到我们可以使用一个哈希表来保存字母的个数,但是,由字母构成的字符串有一个特点,从a到b的字母的代表的值是连着的,那么我们就可以化简为一个数组来保存每个元素的个数。
以下的两种方法分别就是使用哈希表和数组的情况。

代码实现

    bool canConstruct(string ransomNote, string magazine) 
    {

        //方法一
        unordered_map <char,int> um;            //用来保存每个字符出现的次数
        int lengthransomNote = ransomNote.size();
        int lengthmagazine = magazine.size();
        //长度不相等的时候直接返回false
        if(lengthmagazine < lengthransomNote)
        {
            return false;
        }

        //统计第一个字符串中各个元素出现的个数
        //访问第二个字符串 进行元素个数的递减
        for(int i = 0 ; i < lengthransomNote ; ++i)
        {
            ++um[ransomNote[i]];
        }
        for(int i = 0 ; i < lengthmagazine ;++i)
        {
            --um[magazine[i]];
        }

        //访问哈希表中的第二个参数的数值 如果小于 0 那么返回false
        for(pair <char ,int> m : um)
        {
            if(m.second > 0)
            {
                return false;
            }

        } 
        return true;


        //方法二
        int lengthransomNote = ransomNote.size();
        int lengthmagazine = magazine.size();
        //长度不相等的时候直接返回false
        if(lengthmagazine < lengthransomNote)
        {
            return false;
        }

        vector<int> v(26,0);
        for(char x : ransomNote)
        {
            
            ++v[x-'a'];         //对应的第i个字母自增
        }
        for(char x : magazine)
        {
            --v[x-'a'];
        }
        for(int x : v)
        {
            if(x > 0 )
            {
                return false;
            }
        }
        return true;
    }
};

你可能感兴趣的:(leetcode,c++,leetcode,c++)