UVA 10340 子序列 All in All 题解(string数组解法)

博客围绕一道程序设计题展开,题目是判断能否通过删去串t中的字符得到串s。介绍了用数组实现的思路,先分析题意,用类似指针的变量遍历,给出出错代码及问题,后换思路判断t[j - 1]和s[i]是否相等,最后给出完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题没什么思维难度,就是代码实现容易出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!
完整代码如下:
在这里插入图片描述
谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值