题目大意:给一个由A-Z组成的字符串,最大转换maxSwaps次,问连续相同字符串最多多少。
代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
using namespace std;
int num[60],path[60];
bool cmp(int a,int b)
{
if(abs(a)<abs(b)) return true;
else return false;
}
class ColorfulChocolates {
public:
int maximumSpread(string chocolates, int maxSwaps)
{
int ans=-1;
for(int i=0;i<26;i++) //枚举每个字母
{
int cnt=0;
for(int j=0;j<chocolates.length();j++) //寻找该字母所有出现的位置
{
if(chocolates[j]==('A'+i)) num[cnt++]=j;
}
for(int k=0;k<cnt;k++) //以某个字母为中心
{
int tempswaps=0,tempans=1;
memset(path,0,sizeof(path));
if(cnt==1) { if(ans<1) ans=1; break; }
if(cnt==2) {if(abs(num[1]-num[0]-1)<=maxSwaps) if(ans<2) ans=2; break; }
for(int p=0;p<cnt;p++)
{
if(p==k) continue;
path[p]=num[p]-num[k];
}
sort(path,path+cnt,cmp); //按距离绝对值排序
int l=1,r=1; //每靠过来一个下一个靠过来时需要转换的次数就小1(同方向的情况下)
for(int p=1;p<cnt;p++)
{
if(path[p]>0)
{
if((tempswaps+(path[p]-r))>maxSwaps) break;
tempswaps+=(path[p]-r); r++; tempans++;
}
else
{
if((tempswaps-path[p]-l)>maxSwaps) break;
tempswaps+=(-path[p]-l); l++; tempans++;
}
}
if(tempans>ans) ans=tempans;
}
}
return ans;
}
};