給定兩個字符串 s 和 t(長度 ≤ 100,000),判斷 s 是否為 t 的子序列(即能否從 t 中刪除若干字符得到 s)。多測試用例,以 EOF 結束。
i 遍歷 s,指針 j 遍歷 t。s[i] == t[j],則 i++,j++;否則只 j++。i == |s|,說明 s 所有字符按序匹配完畢 → Yes;否則 No。O(|t|),空間 O(1),極快。|s| > |t| 直接輸出 No。scanf("%s%s", s, t) 讀取以空白分隔的字符串,自動處理換行。char s[100005]。#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100005;
char s[MAXN], t[MAXN];
int main(){
while(scanf("%s%s", s, t) == 2){
int ls = strlen(s), lt = strlen(t);
if(ls > lt){ puts("No"); continue; }
int i=0, j=0;
while(i
POJ 1963 是子序列判斷的經典入門題,雙指針線性掃描即可,體現了貪心匹配最早位置的最優性。