做leetcode242题时出现了一个错误:
bool isAnagram(string s, string t) {
map<char,int> cnt;
bool ans = true;
int lens = s.length();
int lent = t.length();
for(int i = 0;i < lens;i++){
cnt[s[i]] += 1;
cout << cnt[s[i]] << endl;
}
for(int i = 0;i < lent;i++){
if(cnt[t[i]] == 0){
cout << t[i] << cnt[t[i]] << endl;
ans = false;
break;
}else{
cnt[t[i]] -= 1;
}
}
// if(!cnt.empty()){
// cout << "here" << endl;
// ans = false;
// }
for(auto& kv:cnt){
if(kv.second != 0){
ans = false;
break;
}
}
其中判断map是否为空我使用
if(!cnt.empty()){
cout << "here" << endl;
ans = false;
}
isAnagram 函数的主要问题在于检查 cnt 是否为空的方式。即使在字符串 t 中的字符与 s 完全匹配,cnt 也不会自动变为空,而是会包含值为零的字符计数。即当map里的数全都归零时,map也非空,而是字母和0的映射,因此不能用cnt.empty()
判断,而是选用
for(auto& kv:cnt){
if(kv.second != 0){
ans = false;
break;
}
}
来判断map内部是否都是0;