牛客练习赛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 的字符串)的主要内容,如果未能解决你的问题,请参考以下文章