子序列

All in All

UVA - 10340
 
这题是参考书上的习题3-9。附上链接,题目意思也很简单,原题就不再重复了。
这题的解题思路需要一点灵感,直接从源串中删,需要考虑每次删哪些字符,这对于问题仅仅要求“能不能得到解”显然太复杂了。换一个角度来说,只要按照目标串的顺序完全出现了目标串的所有字符,即可以完成操作,反之则不能够完成。这样在一个循环内就可以完成程序。C++实现如下:
 
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int p1, p2;
 6     char str1[1000000], str2[1000000];
 7     while (cin >> str2)
 8     {
 9         cin >> str1;
10         p2 = 0;
11         for (p1 = 0; str1[p1] != 0; p1++)
12         {
13             if (str2[p2] == str1[p1])
14             {
15                 p2++;
16             }
17             if (str2[p2] == 0)
18             {
19                 cout << "Yes\n";
20                 break;
21             }
22         }
23         if (str1[p1] == 0)
24             cout << "No\n";
25     }
26     return 0;
27 }

这题还有点坑爹的地方就是数组长度要开的足够大,一开始80 1000 都RE了,估计是数组越界,但是也没想到居然要给那么大(题也不给数据范围的提示),不得不看别人AC掉的程序才知道10^7的长度能确保AC。

posted @ 2017-03-14 23:32  g63  阅读(196)  评论(0编辑  收藏  举报