声明:摘选自“ 算法竞赛入门经典(第2版)”作者: 刘汝佳 / 陈锋 ISBN:9787302291077
子序列
输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串s。 例如,abcde可以得到bce,但无法得到dc。
解题思路:
如果可以得到子序列,那么子序列与父序列相等的元素字母,在父序列里面的位置是按照从小到大排列的,如果,不是从小到大排列,那么就不能得到对应的子序列:如图
#include<stdio.h>
#include<string.h>
char s[30], t[30];
int list[30];
int main()
{
int lent, lens, lend=0; // lent用于记录字符串t的长度, lens用于记录字符串s的长度,lend用于记录数组list的长度,
scanf("%s", s); //输入字符串s
scanf("%s", t); //输入字符串s
lent = strlen(t); //计算字符串t的长度
lens = strlen(s); //计算字符串s的长度
for(int i=0; i<lent; i++) //将字符串t的每个字符与s字符串比较 ,如果相等就将s字符的位置保存在list中
{
for(int j=0; j<lens; j++)
{
if(t[i] == s[j])
{
list[i] = j;
lend += 1;
break; //一旦找到第一个相等的字符就退出,进行下一个循环,防止后面还有相等的字符来干扰结果
}
}
}
int m=0; //m为标志位,m为0说明可以得到字符串t
for(int i=0; i<lend-1; i++)
{
if(list[i] > list[i+1]) m=1; //如果记录位置的s的数字不是从小到大排列的,说明不能按照顺序得到t
}
if(m==0)
{
printf("可以得到字符串t");
}
else
{
printf("不可以得到字符串t");
}
}