news 2026/5/1 11:14:43

音乐小说内容重复识别(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/5/1 11:14:23

银月光紫外LED光源 | G3535N1UVN2U12-302nm | 高均匀度透射仪专用

在分子生物学及相关科研领域&#xff0c;紫外透射仪作为观察与分析核酸电泳条带的关键工具&#xff0c;其光源的性能直接影响成像清晰度、操作便捷性及长期使用成本。传统302nm紫外灯管虽沿用多年&#xff0c;但其普遍存在寿命有限、体积庞大、光衰较快、能效较低等问题。为应对…

作者头像 李华
网站建设 2026/5/1 6:08:29

等级保护建设方案,等保2.0,等保3.0解决方案PPT文件和WORD文件

等保资料合集&#xff1a;等保2.0网络安全等级保护解决方案等保2.0政策规范解读&#xff08;63页PPT&#xff09;等保三级技术建议书等保三级建设方案&#xff08;69页Word&#xff09;等级保护新标准(2.0)介绍密码应用安全性评估方案三级等保安全解决方案商用密码应用安全性评…

作者头像 李华
网站建设 2026/4/23 16:40:03

OpenAI开源GPT-OSS-120b/20b:单卡可运行的MoE推理模型

OpenAI开源GPT-OSS-120b/20b&#xff1a;单卡可运行的MoE推理模型 在消费级GPU上跑一个接近GPT-4能力的语言模型&#xff0c;曾经是开发者社区遥不可及的梦想。而现在&#xff0c;OpenAI用两款名为 gpt-oss-120b 和 gpt-oss-20b 的新模型&#xff0c;把这扇门推开了。 更令人意…

作者头像 李华
网站建设 2026/5/1 2:22:22

Qwen3-32B模型幻觉问题初探

Qwen3-32B的幻觉问题&#xff0c;真不能忽视 试了下Qwen3-32B&#xff0c;第一反应是&#xff1a;这模型太强了。 响应快、逻辑顺、写代码像资深工程师&#xff0c;回答专业问题也一套一套的。你几乎要以为它真“懂”了——理解语义、掌握知识、会推理&#xff0c;甚至能帮你设…

作者头像 李华
网站建设 2026/5/1 8:29:55

【2025年最新】史上最全网络安全面试题+答案

1、什么是SQL注入攻击 前端代码未被解析被代入到数据库导致数据库报错 2、什么是XSS攻击 跨站脚本攻击 在网页中嵌入客户端恶意脚本&#xff0c;常用s语言&#xff0c;也会用其他脚本语言 属于客户端攻击&#xff0c;受害者是用户&#xff0c;网站管理员也属于用户&#xf…

作者头像 李华
网站建设 2026/4/28 0:42:48

15秒创作一首歌?AI音乐模型ACE-Step体验

AI音乐的民主化革命&#xff1a;从一个念头到一首歌只需15秒 你有没有过这样的时刻&#xff1f;某个瞬间的情绪涌上心头——地铁站里擦肩而过的背影、深夜加班时窗外的雨滴、童年老屋前那棵槐树——你多希望有一段旋律能替你说出这些无法言说的感受。但你不会作曲&#xff0c;不…

作者头像 李华