题目相当的简单。唯一的重点就是:
重点
1. 数组要大, Biger than Biger。题目中看不出来需要多大,我也是百度得到是 10万。10 0000大小才AC。开始3000都Runtime Error。UVa的题目还是有些问题,不够严谨,题目完全没有说明字符串会有多长。
解析
app iamapphaha
app
iamapphaha
1. 遍历left,下标 i
2. 遍历right,下标 j
3. 如果不等,j++;如果相等,i++,j++
可以发现 j 总是要自增的,如果 j 走到头,这时有两中情况。一是 i 也走到头,完美。另外就是 i 没有走到头,那就说明 left 中有个字母在 right 中没有找到,就是No。
上面是一种思路。下面是一种思路,也是我代码实现的思路。
1. 遍历left,下标 i
2. 遍历right,下标 j
3. 如果right遍历完,还没有找到相等的元素,那说明 left 中有元素在 right中找不到,也就是说 right 根本没有包含 left,就是No。
如果出现 i == j,当前的right遍历就结束了。接着 left就 next 元素(i++),这时再从头遍历 right,因为有前后顺序,所以 right 不用从0位置开始,可以直接从上次发现相等的位置开始遍历。接着重复前面的过程。最后的循环跳出情况就是 left 全部遍历结束。
代码
下面贴出我自己独立编写的AC代码。
另外,我看不懂网络的连基本语法都有错误的代码是如何厚着脸皮说此题是水题的,还有语法都会报错的代码能AC?我不相信,比如这个。网络博客内容参差不齐,还有很多CSDN博客,都不判断EOF作为结束,怎么能AC,自己意淫的?用自己优越的脑袋执行一遍就认定代码OK?WTF!
前面忘了讲,代码里的 freopen 是算法竞赛书里面推荐的用于本地快速调试的方法。将题目中的input复制到input.txt中,可以快速的测试输出。
注意:get 变量的位置,get = 0 放在第一层 for 里面 是代表 本次 i 是否发现相等元素。如果放在第一层 for 外面,则代表整个left是否发现一个相等的元素,含义是不同的。
//3-9.c UVa10340,2019-03-23
#include <stdio.h>
#include <string.h>
#include <math.h>
//#define LOCAL
#define N 1000000
char sl[N],sr[N];
int main(){
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout)
#endif
//初始化
memset(sl, 0, sizeof(sl));
memset(sr, 0, sizeof(sr));
while(scanf("%s %s", sl, sr)!= EOF){
int i=0,j=0,bgn=0,get=0;
int flag = 1;
for (i = 0; i < strlen(sl);i++){
get = 0;
for (j = bgn; j < strlen(sr); j++){
if (sr[j] == sl[i])
{
get = 1;
bgn = j+1;
break;
}
}
if (!get)
{
flag = 0;
break;
}
}
printf("%s\n", flag?"Yes":"No");
//重置,防止受到上次input的污染
memset(sl, 0, sizeof(sl));
memset(sr, 0, sizeof(sr));
}
return 0;
}