news 2026/4/18 10:18:47

音乐小说内容重复识别(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/4/16 18:49:06

LangFlow与Notion类笔记软件同步更新策略

LangFlow与Notion类笔记软件同步更新策略 在AI应用开发日益普及的今天&#xff0c;一个核心矛盾逐渐显现&#xff1a;技术能力越强的开发者&#xff0c;越倾向于写代码构建智能体&#xff1b;而真正需要使用这些工具的产品、运营甚至教育工作者&#xff0c;却因编程门槛望而却步…

作者头像 李华
网站建设 2026/4/17 20:36:21

沈阳景观灯采购指南

在城市照明体系中&#xff0c;景观灯不仅承担着基础照明功能&#xff0c;更成为塑造城市夜景美学的重要载体。以沈阳为例&#xff0c;这座东北重镇近年来持续推进城市更新与夜间经济建设&#xff0c;对高品质、高适配性的户外照明产品需求显著增长。据行业数据显示&#xff0c;…

作者头像 李华
网站建设 2026/4/18 8:01:54

【分析式AI】-朴素贝叶斯算法模型

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是基于贝叶斯定理和特征条件独立假设的经典分类模型——核心逻辑是“通过已知的‘先验概率’和‘特征概率’&#xff0c;计算‘后验概率’&#xff0c;最终选择概率最高的类别作为预测结果”。 它的“朴素”&#xff08;Naive&a…

作者头像 李华
网站建设 2026/4/17 22:57:31

基于SpringBoot的校园设备维护报修系统

随着社会平均生活水平提高&#xff0c;各高校也开始改善校园日常工作生活环境&#xff0c;为此许多高校为提高校内人员生活工作体验购入大量基础设备&#xff0c;如公共饮水机、公共健身娱乐器材等。随着设备数量的增加&#xff0c;设备出现故障的问题也越发频繁。传统的高校报…

作者头像 李华
网站建设 2026/4/18 7:42:39

Docker本地部署AutoGPT完整指南

Docker本地部署AutoGPT完整指南 在大语言模型&#xff08;LLM&#xff09;飞速演进的今天&#xff0c;我们早已过了“问一句答一句”的阶段。像ChatGPT这样的工具固然强大&#xff0c;但它们本质上仍是被动响应——你得清楚地知道怎么提问、需要什么信息&#xff0c;才能得到满…

作者头像 李华
网站建设 2026/4/18 7:39:36

【车辆侧向速度估计】基于Carsim和simulink联合仿真,利用车辆运动学模型和卡尔曼滤波算法

【车辆侧向速度估计】基于Carsim和simulink联合仿真&#xff0c;利用车辆运动学模型和卡尔曼滤波算法&#xff0c;分析卡尔曼滤波的可观性&#xff0c;通过利用轮速信息和加速度信息对难以直接测量的车辆侧向车速进行估计。 文档详实】刚摸完方向盘的手还在发烫&#xff0c;屏幕…

作者头像 李华