错误的求最长递增自序列算法——写完了才发现,有待于细心的你琢磨

#include<iostream>
#include<string>
using namespace std;
struct subsequence {
string s;//记录子串内容
int length;//记录子串长度
};
int main() {
string str;//原串
cin >> str;
int len = str.length();
struct subsequence *subseq = new subsequence[len];


//每个子串长度不会超过len,所以开辟len个空间,空缺补0;最终赋值给subseq[i].s
char *substr = new char[len];
//记录每个子串长度,最终赋值给subseq[i].length
int count;


//i用来跟踪substr;j用来跟踪str,即控制最外层循环次数;k用来控制内层循环次数
int i,j,k;
char ch;
for (j = len - 1; j >= 0; j--) {//倒着扫描str


i = 0;
substr[i] = str[j];//从左到右填充substr
count = 1;//每个子串初始长度为1


ch = substr[i++];
for (k = j - 1; k >= 0; k--) {
if (ch > str[k]) {//有比ch小的元素,立即存入substr,并且计数增加1
if (i < len) {
substr[i++] = str[k];
count++;
ch = str[k];
}
}
}
//将substr空缺位置补0
for(;i < len;i++)
substr[i] = '\0';


subseq[j].s = substr;
subseq[j].length = count;
}


//将subseq按长度从大到小“选择排序”
struct subsequence sub;
for (i = 0; i < len-1; i++) {
k = i;//默认第i个子串所处位置合适
for (j = i ; j < len; j++) {
if (subseq[k].length < subseq[j].length) {
k = j;
}
}
if (i != k) {//若实际情况与默认不符
sub = subseq[k];
subseq[k] = subseq[i];
subseq[i] = sub;
}
}


for (i = 0; i < len; i++)
cout << subseq[i].s << ' ' << subseq[i].length << endl;


cout << "longest increasing subsequence is ";
//倒序输出
for (i = subseq[0].s.length() - 1; i >= 0; i--)
cout << subseq[0].s[i];
cout<< " , its length is " << subseq[0].length << endl;
system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值