凶案现场

题解 六

哎!今天本来不打算再写题解的,本来准备复习数学去了,但是今天C++老师突然又说了我们要赶快完成一个任务,让我们赶快完成,所以我今晚又不能复习数学了。然后我就在完成老师的任务,啊!那个任务好烦啊,是学习通上面的章节测验,一开始以为不需要做的,但是老师到了期末又通知我们赶紧做,然后我吃了晚饭就开始干了,干了两个小时,心好累,倒不是说做不动,而是那个系统真不好,答案一点都不人性化,比如有一个题目:“如何判断y是一个奇数”,我回答的是:“y%2==1”,然后显示:“答案错误”,答案居然是:”y%2!=0"!啊!我竟然想不到什么词来形容这个题目。最可惜的是,一个测试一共有15道题,必须全对才行,然后我又重做了,重做一次又要10分钟左右,心态爆炸!然后想了想,哎,先AC一道题来寻找一下安慰,顺便写一篇我热爱的题解!
啊,废话太多了,言归正传

题目名称:凶案现场
题目来源:江西理工大学OJ
题目地址:http://oj.jxust.edu.cn/problems/1010

题目描述
大侦探J正在着手调查一起凶案。案发现场中,提取到一DNA序列片段。如果某人的DNA序列片段(这个人的DNA片段当然要比提取到的DNA片段长)和案发现场提取到的DNA序列吻合(也就是说,这个人的DNA片段中有一部分连续的DNA片段是提取到的DNA片段),那他很可能就是凶手。
不过DNA序列实在太长了,手工分析太耗时。而你作为最聪明的程序员,此时正义凌然挺身而出,决定要协助侦探J破案。
输入
第一行输入一个数字T,表示有T组测试数据,接下来每组测试数据第一行是现场提取的DNA序列T(T的长度不超过100000),
第二行是某人的DNA序列S(S长度不超过1000000)。DNA序列均由’A’,‘C’,‘T’,'G’字母表示。
输出
如果T串是S串的子串(也就是说,在S串中可以找到一个连续的片段与T串相同),那么输出YES,否则输出NO
样例输入
2
ACG
CGACG
AAG
ACGT
样例输出
YES
NO

这道题目的话呢,难度也不大,但是很适合萌新学习哦!其实这个题目有很多种解法,但是对于萌新来说呢,现在不要求一题多解,也没必要说去做到一题多解,先掌握很多题目的解法就很不错了,所以这个题目其实有很多也很难懂的解法,但是因为这篇题解是面向萌新的,所以我选择了一个最容易理解的解法,教给大家,大家先掌握这种解法,后续的解法大家后续也会学习到的!

好了,进入正题,先说一下这个题目的考点,如果是在我的解法下的话,有,控制样例输入字符串变量的使用循环的嵌套使用布尔变量的引入循环的控制,这题主要考察对于字符串的掌握。把题目翻译过来就是,给定两个字符串,分先后输入,判断第一个是否是第二个的子串,相信大家应该可以理解子串的含义(即第一个字符串在第二个字符串中完整出现过)。好了,有了对于题目的理解,那么我们就可以来分析了。我的解法大致分为,第一步,设立外层循环,控制样例个数,第二步,内层第一套循环,以第二个字符串的长度控制,因为它被判断的,应当以它的结束作为整体的结束,第三步,设立内层第二套循环,查找并且判断,如果第二个字符串的某个字符与第一个字符串的第一个字母对应了,那么我们就接下去判断,,如果有出现不同的字符,break,退出该层循环,第四步,如果内层第二套循环一直可以持续到最后,使布尔变量为真,第五步,根据布尔变量的值进行输出。

看吧,虽然这是一道简单题,但是想真正把他解释清楚没那么简单,其实我上面叙述的还不够清晰,但是已经足够了,剩下的大家配和代码应该就可以消化了。

上代码!!!

#include <iostream>
#include<string>
#include<cstring>
using namespace std;
int main()
{
    string a;
    string b;
    int n;
    cin >> n;
    bool prime = false;//设置布尔判断变量,用于判断子串是否存在
    for (int i = 1; i <= n; i++)
    {
        cin >> a >> b;//输入两个字符串
        prime = false;//每次都要重置哦,不然就会出错了
        for (int j= 0; j < b.length(); j++)//内层第一套循环,用被判断的字符串做根据,相信大家可以理解,length()函数可以计算字符串变量的长度
        {
            if (b[j] == a[0])//遍历被判断的字符串,如果有和子串第一个字母一样的字母,那就可以接下去继续判断
            {
                for (int k = 0; k < a.length(); k++)//内层第二套循环,用子串长度控制,相信大家可以理解
                {
                    if (b[j+k] != a[k])//这个j+k是为了保留被判断字符串的位置哈,细细琢磨一下就理解啦
                        break;//如果中途又断了,直接退出
                    if (b[j+k] == a[k] && k == a.length() - 1)
                        prime = true;//如果已经判断到最后一个了,而且没有退出,那就说明确实存在了,让布尔变量变成“真”
                }
            }
            if (prime)//如果已经判断确实存在了,那就可以退出内层第一套循环了
                break;
        }
        if (prime)//根据上述的过程,进行输出
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;//好啦,就这么愉快的结束啦!
}

知识点总结:

  1. 控制样例输出个数
  2. 学会使用布尔变量
  3. 掌握字符串变量的使用方法
  4. 学会运用循环的嵌套
  5. 学会对字符串的处理
  6. 学会利用length()函数计算字符串变量的长度
  7. 学会利用break跳出循环

这个题目还是一道比较经典的、萌新必刷的字符串入门题,题目是挺好的,希望萌新们可以掌握这种字符串的处理!这个题目和我上面写的一个题目类似哈,也是一边输入一边输出的,希望萌新们能够明确这一点哈!差点忘了我也是个萌新,啊,我是不是飘了
好啦,我今天晚上看到我的早上写的博客也有20来次观看了诶,有点小兴奋。不过我写题解的目的其实主要还是自己喜欢,为了让自己对题目影响深刻,还有就是能帮助到一些人,我这个倒不是说那种追求名利的人。或者说我在CSDN上面学到的东西确实很多,也想学着大佬们发发博客,教教萌新们,也算是对于CSDN的回报吧,还是挺喜欢博客的!
如果萌新们有什么题目不会做的也可以私信我呀!我虽然不一定会,但是我们也可以一起交流交流,一起学习!!如果我会的话我也会特别给你出一篇题解,哈哈哈!
哎,每次写题解废话都这么多,可能是因为我是真的闲吧,哈哈!
嘿嘿,我又我的目标近了一步!哈哈!
好了。每一篇题解后面都附上一句话。

一场比赛总有人会胜利的,那为什么胜利的人不能是我们呢?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值