牛客练习赛82总结+题解(只有A题Mocha 的字符串)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客练习赛82总结+题解(只有A题Mocha 的字符串)相关的知识,希望对你有一定的参考价值。

题目链接:https://ac.nowcoder.com/acm/contest/11172/A

前言

今天是最近第一次开始刷牛客网的题,感觉还是太菜了,和leetcode的题目相比简直是天差地别,太难了,不愧是acm的题目。而且牛客网还是一如既往的喜欢考数学,第二题直接放弃了。
总结一下情况吧:只做出来了第一题,而且真的是一种煎熬,一刚开始没看那么多,以为很简单,后面发现还有额外条件,而且我是用的indexOf()函数做的,哎,做了很久一直都是错的,而且最难受的是,突然想起来牛客网错了不会给你指出哪个数据错了,就只会直接告诉你错了。哎,享受leetcode和acwing太多错误提示了,导致不告诉我错误就不好调试,也不知道哪里出了问题,只能慢慢调试,调了一个多钟头才调出来,人都傻了。还好最后还是过了,之后看了一下第二题,是道数学题就放弃了,以为太久没做了,而且当时已经被第一道折磨疯了,最后看了一下别人的答案,不知道为什么最后输出是0,算了,等我刷到数学题再去看看吧,牛客网没题解还是很难受的,只能看别人提交的答案。
总之,还需要继续加油吧,不知道今年还有没有机会参加最后一次acm比赛,如果有机会参加,那真的还是需要很努力才行。下面我来讲一下第一题的代码。

题目思路

题目是要求出现k"mocha"并且s的子串最短。当时做的时候没发现最后一个条件,而且测试用例也没有关于第二个条件的例子,所以就一直错。
我们可以用一个数组a来记录每次匹配成功的起始下标,并且用d来记录匹配成功了多少次,如果d>=k就代表已经找到了出现k次的子串,但是我们要记录最短的子串,我们把当前满足的子串的长度a[d] - a[d - k + 1] + 5来更新答案。
理清楚思路发现还是很简单的,主要是比赛的时候有点紧张,所以写代码很乱,以后多参加参加比赛,多锻炼锻炼。

代码

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        String p = in.next();
        int[] a = new int[100010];
        int d = 0;
        int ans = 100005;	//因为p最大长度不会超过100005
        for(int i = 0; i <= n - 5; i++) {
            if("mocha".equals(p.substring(i, i + 5))){
                a[++d] = i;	//记录第d个匹配的字符串的其实位置
                if(d >= k)	//如果满足出现k次,就开始寻找最短子串
                    ans = Math.min(ans, a[d] - a[d - k + 1] + 5);
            }
        }
        if(d >= k) {	//代表出现了至少k次
            System.out.println("Mocha suki!");
            System.out.println(ans);
        } else
            System.out.println("poor Mocha");
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

以上是关于牛客练习赛82总结+题解(只有A题Mocha 的字符串)的主要内容,如果未能解决你的问题,请参考以下文章

牛客练习赛85 A~D题题解

牛客练习赛83题解

牛客网刷题中秋节前开启java专项练习错题总结第一天

补题日记[2022牛客暑期多校1]D-Mocha and Railgun

转载:牛客练习赛17 c 规律题

牛客练习赛89——牛牛小数点(未解决)