初级算法:有效字母的异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

思路1:
我想到的方法是 遍历两个字符串的字母 存放在计数数组中 正好可以用到之前的 data[s.at(i)] 返回一个s串中对应i位置元素的引用,运行不通过,不知道为啥

思路2:类似我的思路 它使用 s[i]-'a’来表示 计数数组中的对应位置 很好用 应该记住 但为什么我是用两个分别记录 然后看是否相等 却不通过?

class Solution {
public:
    bool isAnagram(string s, string t) {
        //思路:   1.首先判断长度是否相等
        //         2.长度相等的情况下 如果在s串出现字母的种类与次数和t串中出现的情况一样 就是异位单词
        //         使用两个大小为26的数组来记录每个字符串
        //         中字母的情况  分别遍历两个字符串
        if(s.length()!=t.length())
            return false;
        int a[26];
        int b[26];
        
        for(int i=0;i<s.length();++i){
            a[s[i]-'a']++;
        }
        
        for(int j=0;j<t.length();++j){
            b[t[j]-'a']++;
        }
        
        for(int k=0;k<=26;++k){
            if(a[k]!=b[k])
                return false; 
        }
        return true;
    }
};

根据题解修改后的代码:

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

思路3:最直接解法方法 代码简单好懂
分别排序 然后比较

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.length()!=t.length())
            return false;
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        if(s==t)
            return true;
        return false;
    }
};
发布了36 篇原创文章 · 获赞 0 · 访问量 618

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/102980398