判断一个序列是否为另一个序列的子序列(两种算法)

来源:互联网 发布:台湾图解gv新域名 编辑:程序博客网 时间:2024/05/29 14:31
/** 判断Xm是否是Yn的子序列 查找过程如下图所示:  a[]: B   C   D   F      i下标   n      |\  |\  | b[]: A B D C A D F E    j下标   m */#include <iostream>/** 解一:时间复杂度为O(n^2)  设|a[n]|≤|b[m]|   */template <class T>bool IsSubSequence(T a[], int n, T b[], int m) {    int t;    t = 0;    for (int i=0; i<n; i++) {                for (int j=t;; j++) {                        if (a[i]==b[j]) {                /**                 找到,记住j位置,下一次从j+1开始.                 */                  t=j+1;                break;             }                        if (j>=m)            /**             没有找到,所以不是子序列。              */                return false;        }    }    return true;    /**     全部比较完,都已经找到。     */ }/** 解二:时间复杂度为O(n) */template <class T>bool _IsSubSequence(T a[], int n, T b[], int m){    int i=0;    int j=0;    while (i < n)    {        if (a[i] == b[j]) /** 相等时,下标同时向后移动一个位置. */        {            i++,j++;        }        else        {            j++;  /** 不等时,只将b[]数组下标向后移动一个位置. */            if (j == m)  /** 当b[]数组找完时,指向了第m+1个不存在的元素,则不符合。 */                return false;        }     }    return true; }int main (int argc, const char * argv[]){        int a[] = {1,3,4,6};    int b[] = {1,2,4,3,1,4,6,5};    if (_IsSubSequence(a,4,b,8)) {        std::cout << "a[]是b[]的子序列!\n";    }    else         std::cout << "不是子序列\n";    return 0;}