3.织女的考验【算法赛】 - 蓝桥云课 (lanqiao.cn)
Debug
注意我这样写就可以通过:
#include <bits/stdc++.h>
using namespace std;
int ans;
int main()
{
int t;cin>>t;
while(t--)
{
ans=0;
int haxi1[26]={0},haxi2[26]={0};
string a,b;cin>>a>>b;
if(a.size()==1)
{
cout<<"YES"<<endl;
}
else
{
for(int i=0;i<a.size();i++)
{
haxi1[a[i]-'a']++;
haxi2[b[i]-'a']++;
}
for(int i=0;i<26;i++)
{
ans+=abs(haxi1[i]-haxi2[i]);
}
if(ans>2)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
#include <iostream>
#include <map>
#include <string>
#include <cmath> // 用于abs函数
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
map<char, int> freqA, freqB;
string a, b;
cin >> a >> b;
if (a.size() == 1) {
cout << "YES" << endl;
continue; // 如果a的长度为1,则直接输出YES并继续下一个测试案例
}
// 填充freqA和freqB
for (char c : a) {
freqA[c]++;
}
for (char c : b) {
freqB[c]++;
}
int ans = 0;
// 遍历两个map,计算频率差的绝对值总和
for (char c = 'a'; c <= 'z'; ++c) {
ans += abs(freqA[c] - freqB[c]);
}
// 如果ans大于2,则输出NO,否则输出YES
if (ans > 2) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
}
}
return 0;
}
但是这样写就通过不了了:
#include <bits/stdc++.h>
using namespace std;
int haxi1[26],haxi2[26];
int ans;
int main()
{
int t;cin>>t;
while(t--)
{
ans=0;
haxi1[26]={0},haxi2[26]={0};
string a,b;cin>>a>>b;
if(a.size()==1)
{
cout<<"YES"<<endl;
}
else
{
for(int i=0;i<a.size();i++)
{
haxi1[a[i]-'a']++;
haxi2[b[i]-'a']++;
}
for(int i=0;i<26;i++)
{
ans+=abs(haxi1[i]-haxi2[i]);
}
if(ans>2)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
原因是第二段代码在循环中进行重置的时候是这样并不是把数组整个进行清0,而是对下标为26的元素进行了清0:
haxi1[26]={0},haxi2[26]={0};
正确的做法应该像第一段代码那样进行列表初始化:
int haxi1[26]={0},haxi2[26]={0};
或者用memset进行清0:
memset(haxi1,0,sizeof haxi1);
memset(haxi2,0,sizeof haxi2);