A23255. 交换字符
填空题
中等
知识点
题目描述
交换字符
题目描述
给定一个字符串S,其中仅包含字符"A"和字符"B"。你每次可以选择交换两个位置相邻的字符。请计算如果要使奇数位置上(位置从1开始)字符"A"的数量等于偶数位置上字符"A"的数量,最少需要进行多少次交换操作。
例如:S="AABABA",从左往右数,奇数位置上字符"A"的数量为1(位置1),偶数位置上"A"的数量为3(位置2、4、6).可将位置2的字符"A"和位置3的字符"B"交换。
交换后,奇数位置上字符"A"的数量和偶数位置上字符"A"的数量都为2,满足题目要求,故最少需要交换一次。
输入描述
输入一个字符串S(2≤S的长度≤105),其中仅包含字符"A"和字符"B"。
输出描述
输出一个整数,表示满足题目要求的最少交换次数,如果无论怎么交换都无法满足题目要求,则输出-1。
样例输入
AABABA样例输出
1参考答案
#include<bits/stdc++.h>
using namespace std;
string s; //存储输入字符串
int len a,cnt; // len:字符串长度;a:位置差异计算;cnt:'A'的总数量
int main(){
cin>>s; //读取输入字符串
Len=s.size(); //获取字符串长度
//遍历字符串中的每个字符
for(int i=0;i<len; i++){
if(s[i]=='A'){ // 遇到'A'时进行处理
if(i % 2){ //若索引为奇数
a++; //累加偶数位'A'的计数影响
}else{ //若索引为偶数
a--; //累加奇数位'A'的计数影响
}
cnt++; //统计'A'的总数量
}
}
//若'A'总数为奇数,无法平分到奇偶位置,输出-1
if(cnt%2!=0){
cout<<-1<<endl;
}else{ //否则输出最小交换次数:差异值的一半
cout<<abs(a)/2<<endl;
}
return 0;
}
上一题
下一题