问题描述:

给定两个字符串 s 和 t ,编写⼀个函数来判断 t 是否是 s 的字⺟异位词。
示例 1:
输⼊: s = "anagram", t = "nagaram"
输出: true
示例 2:
输⼊: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含⼩写字⺟。

思路解析:

思路1:暴力for循环,两层循环逐1判断,先遍历s,再t,且字符串t用过的字母得标记,以免相同的字母记2次未考虑到,不再赘述。

思路2:使用hash表,数组其实就是⼀个简单哈希表,⽽且这道题⽬中字符串只有⼩写字符,那么就可以定义⼀个数组,来记录字符串s⾥字符出现的次数。

比如一个字符串kismc,用大小为26的数组record去记录每个字母出现的次数,而对应的字母的索引表示为: 该字母-'a' ,比如字母k,就用s[i]-'a',表示其数组的索引,并做+1操作,如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上
的数值再做-1的操作。

        最后检查:record数组如果有的元素不为零0,说明字符串s和t⼀定是谁多了字符或者谁少了字符,return false。如果record数组所有元素都为零0,说明字符串s和t是字⺟异位词,return true。

可执行代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool isAnagram(string s,string j){
    int record[26]={0};         //创建一个数组记录s中字母a-z出现的次数;
    for(int i=0;i<s.size();i++){   
        record[s[i]-'a']++;     //全都是小写字母 只需用当前字母-'a'然后在数组中自增操作即可
    }
    for(int i=0;i<j.size();i++){
       record[j[i]-'a']--;      //遍历字符串j,在更新后的record中自减
    }
    for(auto x:record){        //若不为0,则返回false,表示不是字母异位
        if(x!=0){
            return false;
        }
    }
    return true;
}
int main(){
    string s,j;
    cin>>s>>j;
    if(isAnagram(s,j)==false)
        cout<<"不是字母异位"<<endl;
    else cout<<"是字母异位"<<endl;
    return 0;    
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐