您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

超大容量文本的单词统计(洛谷P1308题题解,Java语言描述)

星拱北辰 发布时间:2020-01-25 20:30:13 ,浏览量:0

题目要求

P1308题目链接

在这里插入图片描述 在这里插入图片描述

分析

这题本身的话,题意就挺烦人,下面分析一下。

本题标签“高性能”,再看看数据范围,暴力匹配必死无疑。我讨厌用char[]慢慢墨迹,Java操作这个很烦人,所以我们就争取用String解决问题吧!!

要做两件事:一是获取Pattern单词在Text的众多单词里出现的次数,二是获取Pattern单词在Text的众多单词里的首次出现位置。 我为什么不说是文本的匹配而说单词匹配,看下去,你就明白了。

因为如果说匹配字符串也就可以用String类的indexOf()方法,只是没法直接处理计数,但开个while循环就可以了,也还好办。

要这样也就好了,可惜很恶心,并不是。 它是用空白字符分隔文本为N个单词,我们要匹配单词而不是全文本匹配,对串的普通解法不能解决问题。

这样的话我们的直接思维可能是split(),直接分隔" “就行,但不行。 因为,恶心的是,看提示的一则测试数据,WA一次就发现可能只是任意数量空白字符而已…… 所以要用正则表达式”\\s+"进行切分。

但是~~这样的话你交上去只能得30分,其实根本就思路不对,根据获取的数据集3,统计的应该是从开头到那里的indexOf,那直接的思维就是说,先做一个indexOf,在慢慢去计数呗,可惜还不对,因为这样又回到了文本匹配而不是单词匹配。

真让人头秃啊,那继续琢磨,我们把匹配换成" " + pattern + " ",这样就可以保证前后是与其他单词隔开的,即单独成词,对不起,还是不行啊,因为忽略了开头结尾的特判。

这一加上对开头结尾的考虑,代码量激增,必须加很多变量去做过程的处理。具体的看最后的AC代码就行啦,为了调整整个不出Bug,比较麻烦,所以这题让人恶心。

比如我们要先用startWith(pattern + " “)做开头的判断,用endWith(” " + pattern)做结尾的判断,过程中怎么处理balabala,过程怎么进行跃进式的indexOf计数,如何保证第一次就是真的第一次,也会漏结尾的情况balabala,看代码就好了,多说无益。

还有那个“超大容量”,看后面我第二次提交的情况吧,那是什么鬼数据啊,我的记事本和Word都快炸了……好在只有测试数据9一个测试用例这样,不然岂不……太惨了吧……

此题比较恶心,不想多说了。

第一次提交——WA

在这里插入图片描述

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String pattern = scanner.nextLine();
        String[] text_array = scanner.nextLine().split(" ");
        int counter = 0, index = -1;
        for (int i = 0; i             
关注
打赏
1660750074
查看更多评论
0.0417s