c语言子序列问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言子序列问题相关的知识,希望对你有一定的参考价值。

如果字符串str1中字符依次全部出现在字符串str2中(不要求连续)称str1是str2的子序列。
先输入一个整数n,代表有n组测试数据。
每组数据包括两个字符串str1,str2(0《=str1《str2《20)‘
如果str1是str2的子序列,输出“YES”,否则输出“NO”

#include <stdio.h>

int stringLen(char s[]) 
int len = 0;
while(s[len]) ++len;
return len;


int includeStr(char s[], char t[]) 
int i,j,k;
for(i = 0; s[i]; ++i) 
if(s[i] == t[0]) 
k = i + 1;
for(j = 1; t[j] == s[k] && s[k] && t[j]; ++k,++j);
if(t[j] == '\\0') return i;


return -1;


int main() 
char s[30],t[30];
int n;
scanf("%d",&n);
while(n--) 
scanf("%s%s",t,s);
if(includeStr(s,t) >= 0)
printf("YES!\\n");
else printf("NO!\\n");

return 0;

参考技术A 给个思路
对字符串str1、str2本身排序,使字符串中的字符升序或降序排列
然后用strstr(str1,str2)函数就可以判断是否是子串了

最长递减子序列问题

文章大纲


最长递减子序列问题是找到给定序列的子序列,其中子序列的元素按排序顺序从高到低排列,并且子序列尽可能长。该子序列不一定是连续的或唯一的。

请注意,该问题特别针对不需要连续的子序列,即子序列不需要占用原始序列中的连续位置。
例如,考虑以下子序列:
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
最长递减子序列为[12,10,9,5,3],长度为5;输入序列没有6元递减子序列。
本例中最长的递减子序列并不是唯一的:例如,[12,10,6,5,3]是同一输入序列中另一个等长递减子序列。

我们可以用递归来解决这个问题。对于每个项目,有两种可能性:

  1. 如果当前项目小于LDS中的前一个元素,则将其包含在LDS中,并对其余项目重复出现。
  2. 从LDS中排除当前项目,并重复剩余项目。

最后,返回通过包含或排除当前项而获得的最大值。递归的基本情况是没有留下任何项。以下是该想法的C++、Java和Python

以上是关于c语言子序列问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现最长公共子串与最长公共子序列

被3整除的子序列(纯C语言)-动态规划

C语言输入一组整数,求出这组数字子序列和中最大值

自然语言处理之LCS最长公共子子序列

笔试题1:最长严格递增子序列

独家华为OD机试提供C语言题解 - 最多等和不相交连续子序列