1. 程式人生 > 其它 >判斷子序列(雙指標)

判斷子序列(雙指標)

這個方法怎麼感覺和我一開始自己寫的有點像,但我那時思路不明朗,不清晰,總是錯

先上題:

給定一個長度為nn的整數序列a1,a2,,ana1,a2,…,an以及一個長度為mm的整數序列b1,b2,,bmb1,b2,…,bm。

請你判斷aa序列是否為bb序列的子序列。

子序列指序列的一部分項按原有次序排列而得的序列,例如序列{a1,a3,a5}{a1,a3,a5}是序列{a1,a2,a3,a4,a5}{a1,a2,a3,a4,a5}的一個子序列。

輸入格式

第一行包含兩個整數n,mn,m。

第二行包含nn個整數,表示a1,a2,,ana1,a2,…,an。

第三行包含mm個整數,表示b1,b2,,bm

b1,b2,…,bm。

輸出格式

如果aa序列是bb序列的子序列,輸出一行Yes

否則,輸出No

資料範圍

1nm1051≤n≤m≤105,
109ai,bi109−109≤ai,bi≤109

輸入樣例:

3 5
1 3 5
1 2 3 4 5

輸出樣例:

Yes
題解:這個題該怎麼說呢,單調性當然是有的啦,因為i和j都是往右移,i的移動是根據j來的(這句話很關鍵,前幾個例題都有這樣的一個相對關係)
這題主要思想就是能否按照次序(b)在裡面根據a的次序找到相應的匹配(可能說的不是那麼明白)
遍歷b,掃描a,如果a[i]==b[j],i++,最後看i是否等於序列的總和,就是n
上程式碼:
#include<iostream>
using
namespace std; const int N=100010; int a[N],b[N]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<m;i++) scanf("%d",&b[i]); int i=0; for(int j=0;j<m;j++) { if(i<n&&a[i]==b[j]) i++; }
if(i==n) cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }