c++ :最长共有序列:给定两个数组 a 和 b,输出共有序列中最长的那个

如:a: 1 0 2 3 -1 3 4 0 6 7 -3 6

b: -1 3 0 2 3 9 -1 3 4 0 6 7

输出:-1 3 4 0 6 7

//先说一下这个题目的思路:

/因为要输出这两个序列的最长公共子序列,所以我么必须找到这个公共子序列分别在两个数组中的的位置,又或者是对其中一个序列进行“排序”, 使这个公共部分在两个数组中的位置相同/


#include <iostream> using namespace std;

int main() { 

int a[12] = { 1,0,2,3,-1,3,4,0,6,7,-3,6 };
int b[12] = { -1,3,0,2,3,9,-1,3,4,0,6,7 };
int i, k, c, d, x, max, temp;
x = max = 0;
for (i = 0; i < 12; i++) {
    for (k = 0; k < 12; k++) {
        if (a[k] == b[k]) {   //找a数组的某一位置的值是否和b数组的值相同,相同就记录一次
            x++;
        }
        else {   // 不满足时跳出
            if (x > max) {  // 判断最大长度的那个公共子序列
                max = x ;
                c = k;   // 并且把这个末位置赋给c;
            }
            x = 0;
        }
    }
    // 对数组a进行类似与排序的操作,用后一项挤掉前一项,使这个公共最长序列在两个数组中处于相同位置
    for (d = 0; d < 11; d++) { 
        temp = a[0];
        a[d] = a[d + 1];
        a[11] = temp;
    }
}
cout << "最长共有序列为:";
for (i = c-max ; i < c+1 ; i++) {
    cout << b[i] << " ";  // 输出最长的公共子序列
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值