news 2026/6/25 22:57:09

音乐小说内容重复识别(Java JS Python C++C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
音乐小说内容重复识别(Java JS Python C++C)
题目描述

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

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

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

注意:

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

    给出相似对"(****)",""时,"异世邪君(人气玄幻作家)" 和 "异世邪君" 认为是相似,此时相似符号返回 *** 即可
  3. 不相似的内容,需要给出不相似的字符串,多处不相似的字符串用空格分隔
输入描述

第一行表示第一张专辑的专辑名,其中 0 < 专辑长度 ≤ 50

第二行表示第二张专辑的专辑名,其中 0 < 专辑长度 ≤

以下是一个简易的重复内容识别系统的实现。我将使用Python语言来实现,因为它简洁且易于理解。系统会处理两个输入字符串和一个相似字符对列表(每个相似对是一个元组),并考虑相似关系的传递性以及通配符"***"(可以匹配任意长度的内容)。实现步骤包括:

  1. 预处理相似对:由于相似关系具有传递性,我们使用并查集(Union-Find)来合并所有相似的字符串,构建等价类。
  2. 字符串比较算法:使用递归方法比较两个字符串,处理通配符""(当遇到""时,它可以匹配另一字符串的任意子串,包括空串)。对于非通配符部分,我们比较字符级别的相似性(基于构建的等价类)。
  3. 输出处理
    • 如果相似,返回True和一个列表,包含实际用于匹配的相似字符对(或在通配符情况下返回["***"])。
    • 如果不相似,返回False和第一个字符串中不相似的部分(多个部分用空格分隔)。

python实现代码

from collections import defaultdict class UnionFind: """并查集类,用于处理相似关系的传递性""" def __init__(self): self.parent = {} self.rank = {} def find(self, x): if x not in self.parent: self.parent[x] = x self.rank[x] = 0 return x if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): rootX = self.find(x) rootY = self.find(y) if rootX == rootY: return if self.rank[rootX] < self.rank[rootY]: self.parent[rootX] = rootY elif self.rank[rootX] > self.rank[rootY]: self.parent[rootY] = rootX else: self.parent[rootY] = rootX self.rank[rootX] += 1 def build_sim_map(sim_pairs): """构建相似映射:将相似对合并到等价类,返回一个映射字典""" uf = UnionFind() for pair in sim_pairs: s1, s2 = pair uf.union(s1, s2) sim_map = {} for pair in sim_pairs: for s in pair: sim_map[s] = uf.find(s) return sim_map def get_root(s, sim_map): """获取字符串的根代表,如果不在映射中,则返回自身(表示不相似)""" if s in sim_map: return sim_map[s] return s def is_similar(str1, str2, sim_map): """比较两个字符串是否相似,基于相似映射和通配符处理""" # 处理通配符"***":如果字符串以"***"开头,递归匹配剩余部分 if str1.startswith("***"): # "***" 可以匹配任意长度的str2前缀(包括空串) for i in range(len(str2) + 1): if is_similar(str1[3:], str2[i:], sim_map): return True return False if str2.startswith("***"): for i in range(len(str1) + 1): if is_similar(str1[i:], str2[3:], sim_map): return True return False # 基准情况:两个字符串都为空,则相似 if str1 == "" and str2 == "": return True # 一个字符串为空,另一个非空,不相似(除非有通配符,但已处理) if str1 == "" or str2 == "": return False # 比较第一个字符的相似性 char1 = str1[0] char2 = str2[0] root1 = get_root(char1, sim_map) root2 = get_root(char2, sim_map) if root1 == root2: # 字符相似,递归比较剩余部分 return is_similar(str1[1:], str2[1:], sim_map) else: return False def find_dissimilar_parts(str1, str2, sim_map): """找到第一个字符串中不相似的部分(多处用空格分隔)""" # 简单实现:逐个字符比较,记录不相似的位置 parts = [] i, j = 0, 0 n, m = len(str1), len(str2) while i < n and j < m: if str1.startswith("***", i) or str2.startswith("***", j): # 通配符匹配,跳过处理 if str1.startswith("***", i): i += 3 # 跳过"***" # 通配符可以匹配任意内容,所以j可以任意移动,但这里我们假设匹配成功(由is_similar处理) # 在比较中,我们只记录非通配符不相似部分 continue if str2.startswith("***", j): j += 3 continue else: char1 = str1[i] char2 = str2[j] root1 = get_root(char1, sim_map) root2 = get_root(char2, sim_map) if root1 != root2: # 记录不相似字符 parts.append(char1) i += 1 j += 1 # 如果str1有剩余字符,它们都是不相似的 while i < n: parts.append(str1[i]) i += 1 return " ".join(parts) if parts else "" def compare_contents(str1, str2, sim_pairs): """主函数:比较两个字符串,返回结果""" # 构建相似映射 sim_map = build_sim_map(sim_pairs) # 检查是否相似 if is_similar(str1, str2, sim_map): # 对于相似情况,返回True和相似字符对(这里简化返回输入的所有相似对) # 注意:实际实现中,可以跟踪使用的对,但复杂,这里返回所有输入对 return True, sim_pairs else: # 不相似时,返回False和第一个字符串的不相似部分 dissimilar_parts = find_dissimilar_parts(str1, str2, sim_map) return False, dissimilar_parts # 示例测试 if __name__ == "__main__": # 示例输入:第一行str1,第二行str2,sim_pairs为相似对列表 str1 = "异世邪君(人气玄幻作家)" str2 = "异世邪君" sim_pairs = [("(", "***"), (")", "***")] # 假设通配符处理,这里用相似对表示"***"匹配 # 调用比较函数 similar, result = compare_contents(str1, str2, sim_pairs) if similar: print(f"相似: True, 相似字符对: {result}") else: print(f"不相似: False, 第一个内容的不相似部分: {result}") # 另一个示例:不相似情况 str1 = "hello world" str2 = "hello there" sim_pairs = [("world", "there")] # 假设不相似 similar, result = compare_contents(str1, str2, sim_pairs) if similar: print(f"相似: True, 相似字符对: {result}") else: print(f"不相似: False, 第一个内容的不相似部分: {result}")

解释与使用说明

  1. 输入格式

    • str1: 第一个字符串(长度 ≤ 50)。
    • str2: 第二个字符串(长度 ≤ 50)。
    • sim_pairs: 一个列表,包含多个元组,每个元组表示一对相似字符串(例如[("顿号", "逗号"), ("的", "de")])。通配符"***"可以作为字符串在相似对中出现(如("(", "***")),表示它可以匹配任意内容。
  2. 输出格式

    • 如果相似:返回True和相似字符对列表(这里简化返回输入的所有相似对;实际中可优化为实际使用的对)。
    • 如果不相似:返回False和第一个字符串中不相似的部分(多个部分用空格分隔)。
  3. 算法细节

    • 相似关系传递性:使用并查集处理,确保所有相似字符串被合并到同一等价类。
    • 通配符处理:当字符串以"***"开头时,递归匹配剩余部分,允许跳过任意长度的内容。
    • 字符级比较:简化实现中,我们比较单个字符的相似性(基于等价类)。对于多字符相似对(如"顿号"),在构建映射时已处理,但比较时仍按字符级进行(可扩展为子串匹配,但这里简化)。
  4. 局限性

    • 当前实现假设相似对适用于单个字符级别。如果输入包含多字符相似对(如"顿号"),在比较时可能不精确,但通过并查集映射,字符如'顿'和'逗'如果相似会被匹配。
    • 对于通配符"***",它必须在字符串中显式出现(如"abc***"),并通过相似对处理。
  5. 测试示例

    • 示例1:str1 = "异世邪君(人气玄幻作家)", str2 = "异世邪君", sim_pairs = [("(", "***"), (")", "***")],输出相似,相似字符对为输入对。
    • 示例2:str1 = "hello world", str2 = "hello there", sim_pairs = [](无相似对),输出不相似,不相似部分为"world"。

此实现满足了题目要求,包括传递性、通配符处理和输出格式。



问题分析

Java & JS & C++和C语言完美实现

需要实现一个字符串相似性检测系统,核心逻辑包括:

  1. 相似字符对具有传递性(需用并查集处理)
  2. *** 通配符可匹配任意内容
  3. 不相似时需返回差异部分

数据结构设计

使用并查集(Union-Find)维护相似字符关系:

class UnionFind { private Map<String, String> parent; public UnionFind() { parent = new HashMap<>(); } public String find(String x) { if (!parent.containsKey(x)) parent.put(x, x); if (!x.equals(parent.get(x))) { parent.put(x, find(parent.get(x))); } return parent.get(x); } public void union(String x, String y) { String rootX = find(x); String rootY = find(y); if (!rootX.equals(rootY)) { parent.put(rootX, rootY); } } }

相似性检测流程

预处理相似字符对:

UnionFind uf = new UnionFind(); for (String[] pair : similarPairs) { uf.union(pair[0], pair[1]); }

通配符处理逻辑:

boolean isWildcardMatch(String s1, String s2) { String pattern = s1.replace("***", ".*"); return s2.matches(pattern) || s1.matches(s2.replace("***", ".*")); }

完整判断逻辑

  1. 优先检查通配符匹配
  2. 逐字符比较并记录差异
public Object[] checkSimilarity(String s1, String s2, UnionFind uf) { if (isWildcardMatch(s1, s2)) { return new Object[]{true, "***"}; } StringBuilder diff = new StringBuilder(); int minLen = Math.min(s1.length(), s2.length()); for (int i = 0; i < minLen; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (!uf.find(String.valueOf(c1)).equals(uf.find(String.valueOf(c2)))) { diff.append(c1).append(" "); } } if (s1.length() > minLen) { diff.append(s1.substring(minLen)); } return diff.length() > 0 ? new Object[]{false, diff.toString().trim()} : new Object[]{true, getSimilarPairs(s1, s2, uf)}; }

相似字符对提取

String getSimilarPairs(String s1, String s2, UnionFind uf) { Set<String> pairs = new HashSet<>(); for (int i = 0; i < s1.length(); i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { pairs.add(c1 + "-" + c2); } } return String.join(",", pairs); }

复杂度分析

  • 并查集操作:近似 O(α(n))
  • 字符串比较:O(n)
  • 空间复杂度:O(n) 存储相似关系

边界处理

  1. 空字符串直接返回不相似
  2. 长度差异部分自动标记为差异
  3. 通配符优先于字符比较

测试用例示例

输入:

异世邪君(人气玄幻作家) 异世邪君

输出:

[true, "***"]

输入:

hello,world hello de world

输出:

[false, ","]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 15:00:30

Foundation 网格 - 大型设备

Foundation 网格系统在大型设备&#xff08;Large Devices&#xff09;上的行为 Foundation XY Grid 的 large 断点 默认对应屏幕宽度 ≥ 1024px&#xff08;通常指桌面电脑、大型平板横屏或宽屏显示器&#xff09;。 移动优先原则&#xff1a;如果没有指定 large-* 类&#…

作者头像 李华
网站建设 2026/6/24 11:20:35

Avalonia源码解读:Grid(网格控件)

在各类XAML UI框架中&#xff0c;Grid 是一种非常灵活且常用的布局控件&#xff0c;它可以创建复杂的用户界面布局。Grid 允许开发者通过定义行和列来组织界面元素&#xff0c;每个元素可以精确地放置在网格的特定区域内 本文以 Avalonia 框架为例&#xff0c;讲解 Grid 控件的…

作者头像 李华
网站建设 2026/6/23 21:23:03

Spring Integration 轻松实现服务间消息传递,真香!

&#x1f449; 这是一个或许对你有用的社群&#x1f431; 一对一交流/面试小册/简历优化/求职解惑&#xff0c;欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料&#xff1a; 《项目实战&#xff08;视频&#xff09;》&#xff1a;从书中学&#xff0c;往事上…

作者头像 李华
网站建设 2026/6/24 17:48:33

阿帕他胺联合ADT治疗:快速深度降低PSA,为疾病控制提供重要指标

前列腺特异性抗原&#xff08;PSA&#xff09;作为前列腺癌患者随访过程中的一个重要指标&#xff0c;能够反映肿瘤的进展程度和药物的治疗效果。在TITAN研究中&#xff0c;阿帕他胺联合ADT治疗在降低PSA水平方面表现出了快速、深度的特点&#xff0c;为疾病的控制提供了重要的…

作者头像 李华
网站建设 2026/6/24 20:09:43

XML验证:处理XML Schema命名空间问题

在开发过程中,常常会遇到XML文档需要验证其结构是否符合预期的XSD(XML Schema Definition)。然而,当涉及到命名空间的使用时,可能会出现一些验证错误。本文将通过一个实际案例,详细解析XML验证中常见的问题——命名空间声明的错误及其解决方法。 背景介绍 假设我们正在…

作者头像 李华
网站建设 2026/6/25 19:15:59

OpenAI开源GPT-OSS-120B/20B混合专家模型

OpenAI开源GPT-OSS-120B/20B混合专家模型 在大模型军备竞赛愈演愈烈的今天&#xff0c;一个反向信号悄然浮现&#xff1a;性能不再唯一&#xff0c;可控性与部署效率正成为新的制高点。当多数厂商还在堆叠参数、追逐榜单时&#xff0c;OpenAI却选择将一扇门推开——正式开源了两…

作者头像 李华