蓝桥杯练习------完美的代价

本文解析了如何通过编程解决蓝桥杯竞赛中的回文串问题,涉及最少交换次数将非回文串转换为回文串的算法细节,展示了如何使用C++实现并处理边界条件和计数交换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝桥杯基础练习VIP-完美的代价

(代价确实有点重哈)

时间限制: 1Sec 内存限制: 128MB 提交: 4015 解决: 1150

题目描述

回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。

交换的定义是:交换两个相邻的字符

例如mamad

第一次交换  ad  :  mamda

第二次交换  md  :  madma

第三次交换  ma  :  madam  (回文!完美!)
 

输入

第一行是一个整数N,表示接下来的字符串的长度(N  < =  8000) 

第二行是一个字符串,长度为N.只包含小写字母 

输出

如果可能,输出最少的交换次数。 

否则输出Impossible 

样例输入复制

5 

样例输出复制

3

 代码如下,注释超级超级详细!  详细讲解题目,点击吧

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	string s;
	cin>>s;
	int j=n-1;
	int cnt=0;   //cnt用来统计交换的次数 
	int flag=0;  //flag判断是否已经有一个单独的奇个数的字符了 
	for(int i=0;i<j;i++)
	{  //i从左往右遍历,i从开头开始指向每个字符 
		for(int k=j;k>=i;k--)
		{   //k从右向左遍历,k从结尾开始指向每个字符 
		
			if(k==i)  //当k=i时,说明一直未找到当i!=k时, s[k]==s[i]
			{
				if(n%2==0||flag==1) //(1)当n为偶数,并有字符找不到配对的, impossible
				                    // (2)当n为偶数,并出现了第二个字符没有配对,impossible 
				{
					printf("Impossible");
					return 0;   
				}
				flag=1;  //n为奇数,第一次出现字符没有配对,做个标记 
				cnt+=n/2-i; // 把该字符交换到中间所用的次数 
			}
			else if(s[k]==s[i]) //找到了相同的字符,并且i!=k,不是同一个字符 
			{
				for(int l=k;l<j;l++)  //把s[k]交换到s[j]处
				{
					//交换两个相邻位置的字符 
					swap(s[l],s[l+1]);  //最后时,l+1=j,所以l<j,无等号 
					cnt++;   //记录交换次数 
				}
				j--; //末尾递减 
				break; //结束此次k的循环,开头递增i++,重复操作 
			}
		} 
	}
	printf("%d",cnt);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值