判斷子序列(雙指標)
阿新 • • 發佈:2022-01-24
這個方法怎麼感覺和我一開始自己寫的有點像,但我那時思路不明朗,不清晰,總是錯
先上題:
給定一個長度為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
。
資料範圍
1≤n≤m≤1051≤n≤m≤105,
−109≤ai,bi≤109−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> usingnamespace 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; }