Bootstrap

【编程题目 |100分】音乐小说内容重复识别【华为OD机试 2024 Q2考试题 C卷】

■ 题目描述

【音乐小说内容重复识别】

实现一个简易的重复内容识别系统,通过给定的两个内容名称,和相似内容符号,判断两个内容是否相似;如果相似,返回相似内容;如果不相似,返回不相似的内容。

初始化:给出两个字符串,一些相似字符对,如顿号和逗号相似,的和de相似,猪和潴,给出两个字符串的相似判断结果

输入:两条语句,给出是否相似,对于相似的语句,返回True和相似的字符对;对于不相似的内容,则返回第一个内容的不相似信息,方便后续补充

注意:

相似关系是 具有 传递性的。例如,如果”顿号”和”逗号”是相似的,”逗号”和”分号”是相似的,则”顿号”和”逗号”是相似的。
为了过滤一些无意义的信息,这里***可以匹配任意长度的内容,例如:

给出相似对”(****)”,””时,”异世邪君(人气玄幻作家)” 和 “异世邪君” 认为是相似,此时相似符号返回 *** 即可

不相似的内容,需要给出不相似的字符串,多处不相似的字符串用空格分隔

=========================================================================

基于题目描述和提供的代码片段,下面是一个完整的Java程序示例,实现了简易的音乐小说内容重复识别系统。这个程序将使用`Scanner`类来获取用户输入,并根据定义的相似字符对来判断两个字符串是否相似。

```java
import java.util.*;

public class MusicNovelContentChecker {
    private Map<Character, Set<Character>> similarityPairs;

    public MusicNovelContentChecker() {
        similarityPairs = new HashMap<>();
        // 初始化相似字符对
        similarityPairs.put(',', new HashSet<>(Arrays.asList('、')));
        similarityPairs.put('的', new HashSet<>(Arrays.asList('d', 'e')));
        similarityPairs.put('猪', new HashSet<>(Arrays.asList('潴')));
        // 这里可以继续添加其他相似字符对
    }

    public static boolean areSimilar(String content1, String content2, MusicNovelContentChecker checker) {
        if (content1.equals(content2)) {
            return true;
        }

        // 过滤掉书名后的括号和作者名
        content1 = content1.replaceAll("\\(.*?\\)", "");
        content2 = content2.replaceAll("\\(.*?\\)", "");

        if (content1.length() != content2.length()) {
            return false;
        }

        List<Character> nonSimilarChars = new ArrayList<>();
        for (int i = 0; i < content1.length(); i++) {
            char c1 = content1.charAt(i);
            char c2 = content2.charAt(i);
            if (!checker.isSimilar(c1, c2)) {
                nonSimilarChars.add(c1);
            }
        }

        if (nonSimilarChars.isEmpty()) {
            return true;
        } else {
            // 输出不相似的字符
            System.out.println("不相似的字符: " + String.join(" ", nonSimilarChars));
            return false;
        }
    }

    private boolean isSimilar(char c1, char c2) {
        return similarityPairs.containsKey(c1) && similarityPairs.get(c1).contains(c2);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        MusicNovelContentChecker checker = new MusicNovelContentChecker();

        System.out.println("请输入第一个内容名称:");
        String content1 = in.nextLine();
        System.out.println("请输入第二个内容名称:");
        String content2 = in.nextLine();

        if (areSimilar(content1, content2, checker)) {
            System.out.println("两个内容相似,True");
        } else {
            System.out.println("两个内容不相似,False");
        }

        in.close();
    }
}
```

这个程序首先定义了一个`MusicNovelContentChecker`类,其中包含一个`similarityPairs`映射,用于存储相似字符对。`areSimilar`方法用于判断两个内容是否相似,同时过滤掉书名后的括号和作者名。如果两个内容相似,它将输出`True`;如果不相似,它将输出不相似的字符。

请注意,这个示例程序假设相似字符对是单向的,即如果`c1`和`c2`相似,`c2`和`c1`也相似。如果需要处理更复杂的相似关系,可能需要进一步扩展相似性检查逻辑。
 

;