zoukankan      html  css  js  c++  java
  • 蓝桥杯 完美的代价

    问题描述
      回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
      交换的定义是:交换两个相邻的字符
      例如mamad
      第一次交换 ad : mamda
      第二次交换 md : madma
      第三次交换 ma : madam (回文!完美!)
    输入格式
      第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
      第二行是一个字符串,长度为N.只包含小写字母
    输出格式
      如果可能,输出最少的交换次数。
      否则输出Impossible
    样例输入
    5
    mamad
    样例输出
    3
     1 #include <bits/stdc++.h> 
     2 using namespace std; 
     3 int num[26]; //存储每个字母出现的个数 
     4 int main() { 
     5     int n; 
     6     cin >> n;
     7     string a;  
     8     cin >> a;
     9     int flag = 0; //出现次数为奇数的字母的个数 
    10     int cnt = 0; //交换次数 
    11     int temp = n - 1; //字符串最后一个字母的下标 
    12     for(int i = 0; i < n; i++) { //遍历字符串,计算出现次数 
    13         num[a[i] - 'a']++; 
    14     } 
    15     for(int i = 0; i < 26; i++) { //判断 
    16         if(num[i] % 2 != 0) { 
    17             flag++; 
    18         } 
    19     } 
    20     if ((n % 2 == 0 && flag >= 1) || (n % 2 == 1 && flag >= 2)) {
    21         cout << "Impossible" << endl;
    22         return 0;
    23     }
    24     for(int i = 0; i <= temp; i++) { 
    25         for(int j = temp; j >= i; j--) { 
    26             if(i >= j) { 
    27                 cnt += n / 2 - i; 
    28             } else if(a[i] == a[j]) { 
    29                 for(int k = j; k < temp; k++) { 
    30                     swap(a[k], a[k + 1]); 
    31                     cnt++; 
    32                 } 
    33                 temp--; 
    34                 break; 
    35             } 
    36         } 
    37     } 
    38     cout << cnt << endl; 
    39     return 0; 
    40 } 
  • 相关阅读:
    Arduino学习笔记10
    Arduino学习笔记07
    Arduino学习笔记6
    Arduino学习笔记5
    Arduino学习笔记4
    Arduino学习笔记3
    linux下库文件的编程
    学习编程语言究竟学什么
    Arduino学习笔记2---数字温度计
    Arduino学习笔记0---开发板的了解
  • 原文地址:https://www.cnblogs.com/fx1998/p/12807094.html
Copyright © 2011-2022 走看看