子序列
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。