这道题没什么思维难度,就是代码实现容易出bug,多做这样的题有利于替身自己的编码水平!
题意是这样的:
读入两个字符串s和t,问是否能通过删去串t中的某几个字符得到串s,(大小写区分),如果能则输出Yes,否则输出No
样例输入
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
样例输出
Yes
No
Yes
No
那么,这道题怎样用数组这一简单的数据结构来实现呢?
首先,分析题意,我们可以得到这样的一个思路:遍历s中的每一个元素,看看能否在t中找到对应(不仅顺序对应,而且ASCII相同)的元素!这样的话,我们就需要类似于指针的两个变量,一个指向s中元素,一个指向t中元素。考虑到string内置类型提供了随机访问迭代器,那么我们用 i,j即可作为形式上的“指针”。赋 i,j初值均为0,用两层循环进行遍历,当内层循环结束之后,进行条件判断(怎么判断,详见下文!),进行输出。
先看出错的代码,找了我15分钟:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s,t;
while(cin>>s>>t)
{
int i=0,j=0; //赋0进行顺序查找
for(i=0;i<s.length();i++)
{
for( ;j<t.length();j++)
{
if(s[i]==t[j])
{
j++;
break; //如果找到了一个对应元素,j++后break
}
}
if(j==t.length()&& i<s.length()-1 )
{
cout<<"No"<<endl;
goto loop;
} //这里是认为,如果t已经遍历到末尾了但i还没到末尾,那么输出“No”
}
cout<<"Yes"<<endl;
loop:continue;
}
return 0;
}
交上去,WA!为什么?
建议读者在此顿几分钟…
屏蔽一页后出答案:
好了,现在你可以输入:a jio 了
可以发现,jio遍历完之后,i 的值仍旧为0,原封不动,不满足 i < s.length()-1,那怎么解决呢?
思考了一会儿,我们换种思路,干脆换成判断当前 t [ j-1 ] 的值和当前s [ i ]的值是否相等,如果不等,则说明t不可以通过删去字符段得到s!
完整代码如下:
谢谢大家。