加载中...

【题解】判断子序列


  • 本题提供两种写法,第二种写法更为优雅简洁。

  • 当然为了避免“不严谨”,法一也可以在进入 while 循环前判断 j 是否大于 m,但是毕竟 j 不会超过 b 数组的范围,实际上是 绝对安全 的,而且如果额外判断则有代码重复的累赘感,所以姑且这样写。

写法一

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int a[N], b[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= m; i ++) cin >> b[i];
    
    // 为什么需要j++?因为a[i-1]与a[j-1]匹配成功后,随着i往后移动一位,j也应该向后移动一位
    for (int i = 1, j = 1; i <= n; i ++, j ++)
    {
    // 其实不够严谨,当for(;;)中的j自增后,j有可能超过m,虽然b数组开的范围比m要大10,可以避免越界,但仍然有不严谨的嫌疑
        while (b[j] != a[i]) 
        {
            j ++ ;
            if (j > m) 
            {
                cout << "No";
                return 0;
            }
        }
    }
    cout << "Yes";
    return 0;
}

写法二:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int a[N], b[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= m; i ++) cin >> b[i];
    
    int i = 1, j = 1;
    while (i <= n && j <= m)
    {
        if (a[i] == b[j]) i ++;
        j ++;
    }
    
    i == n + 1 ? cout << "Yes" : cout << "No";
    return 0;
}

文章作者: 心意
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 心意 !
评论
  目录