C++解决有效的字母异位词
·
问题描述:
给定两个字符串 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;
}
更多推荐


所有评论(0)