最長相等子序列

ting9933發表於2020-12-05

連結:https://ac.nowcoder.com/acm/contest/9715/B
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
題目描述
給出一個僅包含小寫字母的字串s,你最多可以操作k次,使得任意一個小寫字母變為與其相鄰的小寫字母(ASCII碼差值的絕對值為1),請你求出可能的最長相等子序列(即求這個字串修改至多k次後的的一個最長子序列,且需要保證這個子序列中每個字母相等)。

子序列:從原字串中取任意多個字母按照先後順序構成的新的字串。
示例1
輸入
2,“abcde”
返回值
3
示例2
輸入
10,“acesxd”
返回值
4
備註:
來源:牛客網
1<=|s|<=2^10 ,1≤k≤3000,其中|s|表示字串的長度。
題解:每個字母一次變化只能變成比這個字母大1或者小1的字母,a<=每個字母<=z,用a—z去遍歷一遍,若都換成a時,每個字母需要的步數存在一個陣列中,對這個陣列進行排序,判斷不超過k步時,最多能交換幾個字母,同理,都換成b時…,換成z時…取這個數量的最大值
程式碼如下:

#include<stdio.h>
#include<string.h>
char s[5000],k;
int string2(int k, char* s )
{
    int i,l,t,v,a[2060],maxx=-1,x=0;
    char j,c;
    l=strlen(s);
    for(j='a'; j<='z'; j++)
    {
        int ans=0,h=0;
        for(i=0; i<l; i++)
        {
            t=s[i]-j;
            if(t<0)
                t=-t;
            a[h++]=t;
        }
        for(i=0; i<h-1; i++)
        {
            for(v=0; v<h-1-i; v++)
            {
                if(a[v]>a[v+1])
                {
                    t=a[v];
                    a[v]=a[v+1];
                    a[v+1]=t;
                }
            }
        }
        t=0;
        for(i=0;i<h;i++)
        {
            ans+=a[i];
            t++;
            if(ans>k)
            {
                t--;
                break;
            }
        }
        if(maxx<t)
            maxx=t;
    }
    return maxx;
}
int main()
{
    scanf("%d %s",&k,s);
    printf("%d\n",string2(k,s));
    return 0;
}

相關文章