题目传送门
题意:给两个字符串s,t,可以在s字符串任意位置后面插入字符c(与前面的不同),问是否能够将s转换为t字符串
构造:首先lens > lent 或者 s[1] != t[1] 一定是No,然后t最前面相同字符长度的部分在s中要相同,否则不能插入,之后的部分只要相同的部分全部存在,不同的部分可以随便插
/************************************************
* Author :Running_Time
* Created Time :2015-8-20 15:29:43
* File Name :I.cpp
************************************************/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
char s[MAXN], t[MAXN];
bool judge(void) {
int lens = strlen (s + 1);
int lent = strlen (t + 1);
if (lens > lent || s[1] != t[1]) return false;
int i, j;
for (j=2; j<=lent; ++j) {
if (t[j] != t[1]) break;
}
for (i=1; i<j; ++i) {
if (s[i] != t[i]) return false;
}
while (i <= lens) {
while (j <= lent && s[i] != t[j]) ++j;
if (j > lent) return false;
i++; j++;
}
return true;
}
int main(void) { //HDOJ 5414 CRB and String
int T; scanf ("%d", &T);
while (T--) {
scanf ("%s%s", s + 1, t + 1);
puts (judge () ? "Yes" : "No");
}
return 0;
}
构造 HDOJ 5414 CRB and String
原文:http://www.cnblogs.com/Running-Time/p/4746320.html