最長相等子序列
連結: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;
}
相關文章
- 最長上升子序列
- 最長公共子序列
- 最長遞增子序列
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 最長公共子序列(JAVA)Java
- Leedcode-最長特殊序列 Ⅰ
- 300. 最長遞增子序列
- Day 45 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列陣列
- 最長公共子序列求方案數
- Leetcode-300. 最長遞增子序列LeetCode
- 594. 最長和諧子序列
- java 實現 最長公共子序列Java
- 死嗑 最長上升子序列(LIS)
- 最長公共子序列 Longest Common Subsequence
- 最長遞增子序列-Java 實現Java
- LeetCode300.最長遞增子序列LeetCode
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- LeetCode-128-最長連續序列LeetCode
- LeetCode 1143.最長公共子序列LeetCode
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- NlogN 求最長不下降子序列(LIS)
- LeetCode516. 最長迴文子序列LeetCode
- 動態規劃:最長上升子序列動態規劃
- 動態規劃求最長降序序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 力扣1143. 最長公共子序列 動態規劃之最長公共子序列力扣動態規劃
- 最長公共子序列LCS 輸出所有LCS
- 51Nod 1006 最長公共子序列Lcs
- leetcode力扣 300. 最長遞增子序列LeetCode力扣
- 673. 最長遞增子序列的個數
- 動態規劃(最長公共子序列LCS)動態規劃
- Leetcode 300 最長遞增子序列(LIS板題)LeetCode
- 最長公共子序列你學會了嗎
- 【修訂版】Leetcode 300 最長遞增子序列LeetCode
- 動態規劃-最長上升子序列模型動態規劃模型
- 最長迴文子序列(不連續) 可輸出迴文序列