题意:给出一个字符串进行重新排列,要求相邻的字符串不能相同,问最字典序最小的字符串是什么
题解:贪心,统计一下每一个字符出现的次数,每次取一个不能和前一个字符相等的最小的字符并且剩下的字符要能排列成一个题目要求的字符串
#include <bits/stdc++.h> #define ll long long #define maxn 100100 using namespace std; char s[maxn]; int a[300]; int check(char ch){ if(a[ch] == 0) return 0; int sum = 0, ma = 0; for(int i=‘a‘;i<=‘z‘;i++){ sum += a[i]; ma = max(ma, i==ch?(a[i]-1):a[i]); } if(2*ma>sum) return 0; else return 1; } int main(){ int l, num=1; scanf("%s", s); l = strlen(s); memset(a, 0, sizeof(a)); for(int i=0;i<l;i++) a[s[i]]++; s[0] = ‘.‘; while(1){ int i; for(i=‘a‘;i<=‘z‘;i++){ if(check(i)&&(i!=s[num-1])){ a[i]--; s[num++] = i; break; } } if(i>‘z‘) break; } if(num-1 == l) printf("%s\n", s+1); else printf("INVALID\n"); //main(); return 0; }
时间: 2024-10-27 12:15:43