Valid Anagram

题目链接:https://leetcode.com/problems/valid-anagram/

题目大意:就是判断两个字符串是否由相同的字符组成(字符个数也要相同)

1)排序方法

将字符串进行排序以后,如果想等,即可

代码如下:

class Solution {
public:
    bool isAnagram(string s, string t) {
        string s_t = s;
        string t_t = t;
        sort(s_t.begin(), s_t.end());
        sort(t_t.begin(), t_t.end());
        if(s_t == t_t)
        {
            return true;
        }

        return false;
    }
};

 

2)hash方法

先统计第一个字符串中各个字符出现的次数,然后再遍历第二个字符串,相同则hash表中的次数减1,最后判断hash表中是否所有字符出现次数均为0

代码如下:

class Solution {
public:
    bool isAnagram(string s, string t) {

        int n = s.size();
        int m = t.size();
        map<char, int> maps;
        for(int i=0; i<n; ++i)
        {
            if(maps.find(s[i]) == maps.end())
            {
                maps.insert(make_pair(s[i], 1));
            }
            else
            {
                maps[s[i]]++;
            }
        }

        for(int i=0; i<m; ++i)
        {
            if(maps.find(t[i]) == maps.end())
            {
                return false;
            }
            maps[t[i]]--;
            if(maps[t[i]] < 0)
            {
                return false;
            }
        }

        map<char, int>::iterator it = maps.begin();
        for(; it!=maps.end(); ++it)
        {
            if(it->second != 0)
            {
                return false;
            }
        }
        return true;
    }
};

 也可以直接用数组来代替map,运行时间上会快一些,代码如下:

class Solution {
public:
    bool isAnagram(string s, string t) {
        vector<int> maps(26, 0);

        for(int i=0; i<s.size(); ++i)
        {
            maps[s[i]-'a']++;
        }

        for(int i=0; i<t.size(); ++i)
        {
            maps[t[i]-'a']--;
        }

        for(int i=0; i<26; ++i)
        {
            if(maps[i] != 0)
            {
                return false;
            }
        }
        return true;
    }
};

 

posted @ 2016-06-18 23:30  Shirley_ICT  阅读(177)  评论(0编辑  收藏  举报