链接
来源:牛客网
题目描述
给出一个仅包含小写字母的字符串s,你最多可以操作k次,使得任意一个小写字母变为与其相邻的小写字母(ASCII码差值的绝对值为1),请你求出可能的最长相等子序列(即求这个字符串修改至多k次后的的一个最长子序列,且需要保证这个子序列中每个字母相等)。
子序列:从原字符串中取任意多个字母按照先后顺序构成的新的字符串
输入:
2 abcde
10 acesxd
输出
3
4
int string2(int k, string s) {
int n,i,j;
int book[220]={0};
int len=s.length();
for(i=0;i<len;i++)
book[s[i]]++;
int maxx=-1,sum,m;
n=k;
for(i=97;i<=122;i++)
{
sum=0;
m=n;
if(book[i]>0)
{
sum=0;
sum+=book[i];
j=i;
k=i;
while(m>0)
{
if(j>122&&k<97)
break;
j++;
if(j<=122)
{
if(book[j](j-i)<=m)
{
sum+=book[j];
m-=book[j](j-i);
}
else
{
sum+=(m/(j-i));
break;
}
}
k–;
if(k<97||book[k]==0)
continue;
if(book[k](i-k)<=m)
{
sum+=book[k];
m-=book[k](i-k);
}
else
{
sum+=(m/(i-k));
break;
}
}
if(maxx<sum)
maxx=sum;
}
}
return maxx;
}
};
int string2(int k, string s) {
// write code here
int i,j;
int a[3622];
int b[3345];
int len;
len=s.size();
for(i=0;i<len;i++)
{
a[i]=s[i]-‘a’;
}
int mx=-1;
for(i=0;i<26;i++)
{
for(j=0;j<len;j++)
b[j]=abs(a[j]-i);
sort(b,b+len);
// printf(“i=%d>>>\n”,i);
// for(j=0;j<len;j++)
// printf("%d “,b[j]);
// printf(”%>>\n");
int bu=k;
for(j=0;j<len;j++)
{
bu=bu-b[j];
if(bu<0)
break;
}
if(j>mx)
{
// printf(“i=%d>>>>>>>>>>>>\n”,j);
mx=j;
}
}
return mx;
}
};