#include<stdio.h>
#include<iostream>
#define N 100
using namespace std;
int main(void)
{
//存储原字符串
char str[N];
//b[j]存储以j为长度的递增子序列的结尾元素
char b[N];
int cases;
cout<<"请输入案例个数:"<<endl;
cin>>cases;
while(cases--)
{
cout<<"请输入字符串:"<<endl;
cin>>str;
//初始化各变量
int i;
int length = strlen(str);
b[0] = '0'; //b[0]为最小,假设输入的字符全部是字母
b[1] = str[0];//以1为长度的递增子序列的结尾元素都是str[0]
int first,mid,end;//分别为二分查找的首,中,尾位置
int maxLen = 1; //为目前递增子序列最大长度
for(i=1;i<length;i++)
{
first = 0, end = maxLen;
while(first<=end)
{
mid = (first+end)/2;
if(b[mid]<str[i])
first = mid +1;
else
end = mid -1;
}
b[first] = str[i];
if(first>maxLen) maxLen++;
}
cout<<"最长递增子序列的长度为:"<<maxLen<<endl;
cout<<"最长递增子序列为:"<<endl;
for(i=1;i<=maxLen;i++)
cout<<b[i];
cout<<endl;
}
return 0;
}
最长递增子序列模板
最新推荐文章于 2024-05-13 08:50:12 发布