news 2026/2/4 6:50:10

音乐小说内容重复识别(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/1/30 12:55:46

分享一次来自奇安信的面试经历

前言 本文主要分享我的网络安全岗位面试经历&#xff0c;希望对准备求职的同学有所帮助。先简单说下面试前的背景&#xff1a;2023年3月入职奇安信集团安全研究岗&#xff0c;主攻渗透测试方向。 篇幅可能稍长&#xff0c;大家多包涵哈。 简历 我的简历用Markdown编写&…

作者头像 李华
网站建设 2026/2/3 17:02:35

Qwen-Image低显存部署与中文海报生成

Qwen-Image低显存部署与中文海报生成&#xff1a;从模型镜像到专业级视觉创作实战 你有没有遇到过这样的场景&#xff1f;客户发来一条需求&#xff1a;“做个端午节活动海报&#xff0c;要有‘端午安康’四个字&#xff0c;风格传统一点&#xff0c;还得带点现代感。” 于是你…

作者头像 李华
网站建设 2026/2/1 16:30:17

开源项目版本管理终极指南:告别分支混乱与代码冲突

开源项目版本管理终极指南&#xff1a;告别分支混乱与代码冲突 【免费下载链接】qmk_firmware Open-source keyboard firmware for Atmel AVR and Arm USB families 项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware 你是否曾在深夜调试代码时&#xff0…

作者头像 李华
网站建设 2026/2/1 23:03:05

露,机能实验室整体解决方案 行为学实验室整体解决方案 动物行为学整体解决方案 人体生理实验整体解决方案

在医学教育中引入生理实验&#xff0c;有助于打破临床与基础阶段的早期壁垒&#xff1a;学生通过亲身参与相互性自身实验&#xff0c;深化对基础实验意义的认知&#xff0c;同时积累临床诊断的直观感受&#xff0c;安徽&#xff0c;正华&#xff0c;生物动物行为实验站属于综合…

作者头像 李华
网站建设 2026/1/29 11:58:58

GPON OLT 和 EPON OLT 刚入门怎么选?

对于很多小白来说&#xff0c;不从事光模块行业&#xff0c;不了解GPON OLT 和 EPON OLT光模块的不同到底在哪里&#xff0c;更不知道怎么去选择更合适自己的产品&#xff0c;但新项目测试急需确定&#xff0c;怎么根据项目需求进行选择呢&#xff1f;项目催的急&#xff0c;选…

作者头像 李华