测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题