判断一个序列是否为另一个序列的子序列(两种算法)
来源:互联网 发布:台湾图解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;}