LeetCode-242 Valid Anagram

https://leetcode.com/problems/valid-anagram/

Given two strings s and t, write a function to determine if t is an anagram of s.

For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.

Note:
You may assume the string contains only lowercase alphabets.

Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?

1、两个map,分别统计s、t中各字母出现的次数,再比较(128ms)

class Solution {
public:
    bool isAnagram(string s, string t) {
    map<char, int> ms;
    map<char, int> mt;
    //统计s中的单词频率
    for (int i = 0; i < s.size(); i++){
    if (ms.find(s[i]) == ms.end())
    ms.insert(pair<char, int> (s[i], 1));
    else
    ms[s[i]]++;
    }
    //统计t中的单词频率
    for (int i = 0; i<t.size(); i++){
    if (mt.find(t[i]) == mt.end())
    mt.insert(pair<char, int> (t[i], 1));
    else
    mt[t[i]]++;
    }
    if (mt.size() != ms.size())
    return false;
for (map<char, int>::iterator iters = ms.begin(), itert = mt.begin(); iters != ms.end() && itert != mt.end(); iters++, itert++){
if (iters->first != itert->first || iters->first == itert->first && iters->second != itert->second){
return false;
}
}
    return true;
    }
};

改进1.1:首先即比较s、t长度是否相等(112ms)

 添加:

if(s.size()!=t.size())
            return false;

改进1.2:两个map,首先将'a'—'z'均对应0,再统计s、t中各字母次数,再比较(64ms)

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size()!=t.size())
            return false;
     map<char, int> ms;
     map<char, int> mt;
     for(char ch = 'a';ch<='z';ch++){
         ms[ch] = 0;
         mt[ch] = 0;
     }
     //统计s中的单词频率
     for (int i = 0; i < s.size(); i++){
         ms[s[i]]++;
     }
     //统计t中的单词频率
     for (int i = 0; i<t.size(); i++){
     mt[t[i]]++;
     }
     if (mt.size() != ms.size())
     return false;
for (map<char, int>::iterator iters = ms.begin(), itert = mt.begin(); iters != ms.end() && itert != mt.end(); iters++, itert++){
if (iters->second != itert->second){
return false;
}
}
     return true;
    }
};

改进1.3:一个map,对s中各字母++,对t中各字母--,比较最后是否有非0(64ms)

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size()!=t.size())
            return false;
     map<char, int> m;
     int len = s.size();
     for (int i = 0; i < len; i++){
         m[s[i]]++;
         m[t[i]]--;
     }
for (map<char, int>::iterator iters = m.begin(); iters != m.end(); iters++){
if (iters->second != 0){
return false;
}
}
     return true;
    }
};

2、两次排序,直接比较排序后的两字符串是否相等(76ms)

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size()!=t.size())
            return false;
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        return s==t;
    }
};

3、一个hash表,各字母转换成数字,次数保存在对应下标中,同样对s中++,对t中--,看最后是否有非0元素(12ms)

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size()!=t.size())
            return false;
    int hash[26] = {0};
    int len = s.size();
    for (int i = 0; i < len; i++){
       hash[s[i]-'a']++;
       hash[t[i]-'a']--;
    }
for (int i = 0;i<26;i++){
   if(hash[i]!=0)
       return false;
}
    return true;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值