关键字标识

题目描述

给定一个关键词集合 words 和一个字符串 inputStr,要求将 inputStr 中出现的所有关键词用标签标记:

关键词标签的起始为**,结束为** 。

把可以合并的标签进行合并,即使用最少的标签。合并规则如下:

关键词相邻则进行合并,如 ab、cd为关键词,且在字符串中相邻,则合并为 abcd

关键词相交则进行合并,如 zhi、hid为关键词,且在字符串中相交,则合并为 zhid

解答要求

时间限制:1000ms, 内存限制:256MB

输入

第1行一个整数 count,表示 words 中的关键词的个数,取值范围:1, 64

第2行 count 个字符串,表示关键字词列表 words,每个关键词仅含英文小写字母,长度范围:1,16

第3行一个字符串 inputStr,仅含英文小写字母(无空格),长度范围:1,512

输出

一个用最少关键词标签标记的字符串

样例

输入样例 1

java 复制代码
4
cd df op qr
opqracdfg

输出样例 1

java 复制代码
<b>opqr</b>a<b>cdf</b>g

提示样例 1

java 复制代码
关键词 op qr 出现在字符串中,且在字符串中相邻,因此可合并为 opqr;
cd df 出现在字符串中,且在字符串中相交,因此可合并为 cdf ;
其它字符保持不变。
处理后为 <b>opqr</b>a<b>cdf</b>g,使用了 2 个标签 。
<b>op</b><b>qr</b>a<b>cd</b><b>df</b>g也是一种标记方式,但关键词未作合并,需要用到 4 个标签,标签个数不是最少的。

输入样例 2

java 复制代码
3
abbb def bbg
aabbbgz

输出样例 2

java 复制代码
a<b>abbbg</b>z

提示样例 2

java 复制代码
关键字abbb和bbg合并为abbbg

Java算法源码

java 复制代码
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    // 待实现函数,在此函数中填入答题代码
    private static String getTaggedString(String[] words, String inputStr) {
        HashSet<String> wordSet = new HashSet<>(Arrays.asList(words));
        int[] result = setAllPos(wordSet, inputStr);
        if (result.length == 0) {
            return inputStr;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.length; i++) {
            if (result[i] == 1) {
                sb.append("<b>").append(inputStr.charAt(i)).append("</b>");
            } else {
                sb.append(inputStr.charAt(i));
            }
        }
        String convertStr = sb.toString();
        convertStr = convertStr.replace("</b><b>", "");
        return convertStr;
    }

    private static int[] setAllPos(HashSet<String> wordSet, String inputStr) {
        int len = inputStr.length();
        int[] result = new int[inputStr.length()];
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j <= len; j++) {
                if (wordSet.contains(inputStr.substring(i, j))) {
                    for (int k = i; k < j; k++) {
                        result[k] = 1;
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
        cin.nextLine();
        String[] words = cin.nextLine().split(" ");
        String inputStr = cin.nextLine();
        cin.close();

        String result = getTaggedString(words, inputStr);
        System.out.println(result);
    }
}
相关推荐
唐青枫16 分钟前
Java Gradle 实战指南:从 Wrapper、Kotlin DSL 到 Spring Boot 多模块构建
java·kotlin·gradle
wuqingshun31415918 分钟前
如何理解Spring Boot中的starter?
java·spring boot·后端
带刺的坐椅18 分钟前
Solon TeamAgent 协作协议:从 SEQUENTIAL 流水线到 HIERARCHICAL 主管团队
java·ai·llm·agent·solon
wuqingshun31415927 分钟前
SpringBoot是如何实现自动配置的
java·spring boot·后端
用户0537040314330 分钟前
我的学习记录泛型
java
zhouhui00132 分钟前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
java·spring boot·redis·ai编程
JRedisX39 分钟前
Java从零手写企业级内存数据库
java
萧瑟余晖41 分钟前
JDK 20 新特性详解
java·开发语言
hdsoft_huge43 分钟前
SpringBoot系列17:日志体系Logback配置,日志分割、脱敏、异常堆栈收集规范(生产级落地)
java·spring boot·logback
吃饱了得干活1 小时前
扫码登录如何实现?从原理到实战
java·spring boot·redis