验证子串(信息学奥赛一本通-T1140)

【题目描述】

输入两个字符串,验证其中一个串是否为另一个串的子串。

【输入】

输入两个字符串, 每个字符串占一行,长度不超过200且不含空格。

【输出】

若第一个串s1是第二个串s2的子串,则输出(s1) is substring of (s2)

否则,若第二个串s2是第一个串s1的子串,输出(s2) is substring of (s1)

否则,输出 No substring。

【输入样例】

abc
dddncabca

【输出样例】

abc is substring of dddncabca

【源程序】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    char s1[200],s2[200];

    gets(s1);//获取字符串s1
    gets(s2);//获取字符串s2

    if(strstr(s2,s1))//判断s1是否是s2的子串
    {
        cout<<s1<<" is substring of "<<s2<<endl;
        return 0;
    }
    if(strstr(s1,s2))//判断s2是否是s1的子串
    {
        cout<<s2<<" is substring of "<<s1<<endl;
        return 0;
    }
    cout<<"No substring"<<endl;
    return 0;
}

 

### 信息学奥赛一本 1104 题目解析 对于信息学奥赛一本中的第1104题,该题目涉及的是关于字符串处理以及特定模式匹配的内容。具体来说,此题要求实现一个简单的文本替换功能。 #### 输入描述 程序需接收两行输入数据。第一行为待处理的原文本S;第二行为指定要被替换成星号(*)字符的目标子串T。这里需要注意一些边界条件,比如目标子串可能为空或者不存在于原之中等情况[^3]。 #### 输出描述 按照题目规定,在完成所有必要的替换之后,应该输出修改后的最终版本的新字符串作为结果。如果目标子串在整个过程中从未出现过,则整个过程实际上不会改变原始字符串,因此应当保持不变地打印出来[^3]。 #### 实现方法概述 为了高效解决这个问题,可以采用滑动窗口的方法来遍历源字符串并寻找匹配项的位置。一旦找到匹配位置就立即执行相应的替换动作,并继续向后扫描剩余部分直到结束为止。此外,考虑到效率问题,建议预先计算好新旧长度差以便一次性分配足够的缓冲区大小用于构建新的输出字符串[^3]。 ```cpp #include <iostream> #include <string> using namespace std; int main() { string s, t; getline(cin, s); getline(cin, t); size_t pos = 0; while ((pos = s.find(t, pos)) != string::npos) { s.replace(pos, t.length(), "*"); ++pos; // Move past the last replacement to avoid infinite loop on empty target strings. } cout << s << endl; return 0; } ``` 上述C++代码实现了基本的功能需求,过`find()`函数定位子串首次发生处再调用成员函数`replace()`来进行实际替换工作。注意这里的逻辑也考虑到了当`t`为空时的情况,防止无限循环的发生[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值