根据最长公共后缀子串对字符串进行分组的教程

根据最长公共后缀子串对字符串进行分组的教程

本教程旨在解决如何根据字符串的最长公共后缀子串(特别是域名/子域名结构)对一组字符串进行高效分组的问题。我们将通过一个JavaScript函数示例,详细解析其实现逻辑,包括如何识别子域名关系、构建分组字典,并确保每个字符串被精确地归类到其最长的匹配后缀子串下,从而生成一个结构化、易于理解的分组结果。

1. 问题描述:按最长公共后缀子串分组字符串

在处理诸如域名列表等字符串数据时,我们经常需要根据它们的最长公共后缀子串进行分组。例如,给定一个域名列表 [“samsung.phone.com”, “lg.phone.com”, “phone.com”, “camera.dsrl.nikon.com”, “amd.gpu.com”, “intel.cpu.com”],我们的目标是创建一个字典(或映射),其中键是作为组标识的最长公共后缀子串,值是匹配该后缀的原始字符串列表。

这里的“最长公共后缀子串”特指那些在原始列表中也作为独立项出现的、且能作为其他字符串的后缀的子串。例如:

“samsung.phone.com” 和 “lg.phone.com” 都以 “phone.com” 结尾,且 “phone.com” 也在列表中,因此它们应归类到 “phone.com” 组。如果添加 “cpu.com”,则 “intel.cpu.com” 应归类到 “cpu.com” 组。如果添加 “hello.samsung.phone.com”,并且 “samsung.phone.com” 也在列表中,那么 “hello.samsung.phone.com” 应该归类到 “samsung.phone.com” 组,而不是更短的 “phone.com” 组,因为 “samsung.phone.com” 是更长的匹配后缀。

最终输出的字典结构应如下所示:

{  "phone.com": ["lg.phone.com", "samsung.phone.com"],  "camera.dsrl.nikon.com": [],  "amd.gpu.com": [],  "intel.cpu.com": []}

注意,如果一个字符串本身没有更长的字符串以其作为后缀,它将作为键存在,但其值列表可能为空。

2. 解决方案:基于子域名的分组算法

我们将通过一个JavaScript函数 filterBySubdomain 来实现这一分组逻辑。该函数接收一个字符串列表,并返回一个分组字典。

2.1 核心算法解析

该算法分多个步骤进行,以确保准确地识别和分组字符串:

Clipfly Clipfly

一站式AI视频生成和编辑平台,提供多种AI视频处理、AI图像处理工具。

Clipfly 129 查看详情 Clipfly

初始化字典:创建一个空字典 dict,并将输入列表 domList 中的每个字符串作为键,初始化其值为一个空数组。这一步确保所有潜在的分组键都存在。

const dict = {}; // key: subdomain, value: list of domainsdomList.forEach((el) => (dict[el] = []));

识别直接子域名关系:通过嵌套循环遍历 domList。对于每一对不同的字符串 domList[i] 和 domList[j],检查 domList[j] 是否以 domList[i] 作为其“子域名”部分。这里的“子域名”被定义为 domList[j] 中第一个点号 . 之后的部分。如果匹配,则将 domList[j] 添加到 dict[domList[i]] 的列表中。

for (let i = 0; i < domList.length; i++) {  for (let j = 0; j < domList.length; j++) {    if (i !== j) {      const subdomain = domList[j].substring(domList[j].indexOf(".") + 1);      if (subdomain === domList[i]) {        dict[domList[i]].push(domList[j]);      }    }  }}

例如,如果 domList[j] 是 “samsung.phone.com”,domList[i] 是 “phone.com”,那么 subdomain 将是 “phone.com”,匹配成功,”samsung.phone.com” 会被添加到 dict[“phone.com”] 中。

识别并收集所有已分组的域名:遍历当前 dict,将所有作为值列表中的域名收集到一个 mergedDomainList 中。这个列表包含了所有被识别为某个键的“子域名”的字符串。

let mergedDomainList = [];for (const [subdomain, domainList] of Object.entries(dict)) {  mergedDomainList = [...mergedDomainList, ...domainList];}

移除不作为分组键的项:遍历 mergedDomainList。如果一个字符串 x 在 dict 中作为键存在,但其值列表 dict[x] 为空(即它没有其他字符串以它为直接子域名),那么它就不应该成为一个分组键。因此,将其从 dict 中删除。这一步用于清理那些虽然存在于原始列表但实际上没有扮演“分组中心”角色的字符串。

mergedDomainList.forEach((x) => {  if (dict[x] && dict[x].length === 0) delete dict[x];});

例如,如果 intel.cpu.com 没有其他字符串以它为子域名,且 cpu.com 存在并成功分组了 intel.cpu.com,那么 intel.cpu.com 就不应再作为一个空键存在。

精炼分组列表以确保最长后缀匹配:这是最关键的一步,用于实现“最长公共后缀子串”的逻辑。首先,获取当前 dict 中所有剩余的键(它们是最终的分组标识)。然后,对于 dict 中的每一个键值对,筛选其值列表:只保留那些是当前 dict 中任何其他键的字符串。这意味着如果 samsung.phone.com 已经是一个键,那么 hello.samsung.phone.com 应该被分组到 samsung.phone.com 下,而不是 phone.com 下。通过将 samsung.phone.com 从 phone.com 的值列表中移除,我们确保了更长的后缀匹配优先。

const toRemove = Object.keys(dict); // 最终作为分组键的列表for (const [key, value] of Object.entries(dict)) {  dict[key] = value.filter(function (el) {    return !toRemove.includes(el); // 移除那些本身也是分组键的字符串  });}

2.2 示例代码

/** * 根据最长公共后缀子串(子域名)对字符串列表进行分组。 * @param {string[]} domList 包含域名和子域名的字符串列表。 * @returns {Object.} 一个字典,键为子域名,值为对应的域名列表。 */function filterBySubdomain(domList) {  const dict = {}; // 键: 子域名, 值: 对应的域名列表  // 1. 初始化字典:将所有输入字符串作为潜在键,值为空列表  domList.forEach((el) => (dict[el] = []));  // 2. 识别直接子域名关系  // 遍历所有字符串,查找哪些字符串是另一个字符串的直接子域名  for (let i = 0; i < domList.length; i++) {    for (let j = 0; j  {    // 检查 x 是否存在于 dict 且其值列表为空    if (dict.hasOwnProperty(x) && dict[x].length === 0) {      delete dict[x];    }  });  // 5. 精炼分组列表,确保最长后缀匹配原则  // 获取当前所有有效的分组键(子域名)  const finalKeys = Object.keys(dict);  for (const [key, value] of Object.entries(dict)) {    // 过滤掉值列表中那些本身也是最终分组键的字符串    // 这确保了例如 "hello.samsung.phone.com" 会被分组到 "samsung.phone.com"    // 而不是更通用的 "phone.com"    dict[key] = value.filter(function (el) {      return !finalKeys.includes(el);    });  }  return dict;}

2.3 使用示例

// 示例输入数据const x1 = [  "samsung.phone.com",  "lg.phone.com",  "phone.com",  "camera.dsrl.nikon.com",  "amd.gpu.com",  "intel.cpu.com",];const x2 = [  "samsung.phone.com",  "lg.phone.com",  "phone.com",  "camera.dsrl.nikon.com",  "amd.gpu.com",  "intel.cpu.com",  "cpu.com", // 新增项];const x3 = [  "samsung.phone.com",  "lg.phone.com",  "phone.com",  "camera.dsrl.nikon.com",  "amd.gpu.com",  "intel.cpu.com",  "cpu.com",  "hello.samsung.phone.com", // 新增项];// 调用函数进行分组const result1 = filterBySubdomain(x1);const result2 = filterBySubdomain(x2);const result3 = filterBySubdomain(x3);// 打印结果console.log("--- 示例 1 ---");console.log(result1);console.log("n--- 示例 2 ---");console.log(result2);console.log("n--- 示例 3 ---");console.log(result3);

2.4 预期输出

--- 示例 1 ---{  'phone.com': [ 'samsung.phone.com', 'lg.phone.com' ],  'camera.dsrl.nikon.com': [],  'amd.gpu.com': [],  'intel.cpu.com': []} --- 示例 2 ---{  'phone.com': [ 'samsung.phone.com', 'lg.phone.com' ],  'camera.dsrl.nikon.com': [],  'amd.gpu.com': [],  'cpu.com': [ 'intel.cpu.com' ]} --- 示例 3 ---{  'samsung.phone.com': [ 'hello.samsung.phone.com' ],  'phone.com': [ 'lg.phone.com' ],  'camera.dsrl.nikon.com': [],  'amd.gpu.com': [],  'cpu.com': [ 'intel.cpu.com' ]}

3. 注意事项与总结

性能考量: 该算法涉及多层循环和数组操作,对于非常大的输入列表,其时间复杂度可能较高。具体来说,嵌套循环识别子域名关系是 O(N^2),后续的数组操作也会增加开销。在处理海量数据时,可能需要考虑更优化的数据结构或算法,例如使用Trie树(前缀树)来加速后缀匹配。“子域名”的定义: 本教程中的“子域名”特指第一个点号之后的部分。如果你的“最长公共后缀子串”定义不同(例如,不限于点号分隔,或需要考虑更复杂的模式),则需要修改 substring(domList[j].indexOf(“.”) + 1) 这一部分逻辑。空列表处理: 如果一个键最终对应的列表为空,这意味着该键本身存在于原始输入中,但没有其他字符串以其作为最长公共后缀。这符合问题要求,即即使没有匹配项,该键也应存在。调试技巧: 理解此类多步骤算法的最佳方法是在关键步骤设置断点,并使用 console.log 输出中间状态,逐步观察数据的变化。

通过上述 filterBySubdomain 函数,我们能够有效地根据最长公共后缀子串对字符串进行分组,尤其适用于域名或类似结构的数据整理。该方法清晰地定义了分组规则,并通过多阶段处理确保了结果的准确性和一致性。

以上就是根据最长公共后缀子串对字符串进行分组的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/747264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 18:21:17
下一篇 2025年11月25日 18:21:39

相关推荐

  • 硬币集会,市场预测,多边形和波尔卡多:炒作是什么?

    分析市场预测与山寨币热潮,聚焦多边形、波卡币及新兴山寨项目。模因币etf是否会成为现实? 山寨币热潮,市场展望,多边形与波卡:背后的故事 加密货币市场正热闹非凡!关于山寨币反弹的预测以及模因币ETF的可能性正在引发热议。我们来深入探讨多边形(Polygon)、波卡(Polkadot)以及其他潜在资产…

    2025年12月8日
    000
  • 区块链嗡嗡声:万事达卡,波纹和加密演化

    深入了解最新区块链动态:万事达卡与ripple的变革之路。从支付整合到法律博弈,看它们如何影响加密货币未来的发展。 区块链热潮:万事达卡、Ripple与加密演进 传统金融与加密世界的融合速度正在加快。本周,我们将聚焦区块链技术与MasterCard、Ripple等重量级企业的互动关系,解析他们最新的…

    2025年12月8日
    000
  • Blockdag,Avalanche和Airdrop Advantage:加密货币的新时代

    探索blockdag如何借助受avalanche启发的空投策略,在交易所上线之前构建一个充满活力的生态系统,强调用户参与与实际应用场景。 Blockdag,Avalanche和Airdrop优势:加密货币的新纪元 在快速变化的加密世界中,项目方持续寻找创新方式来建立社区并推动广泛应用。BlockDa…

    2025年12月8日
    000
  • Jito(JTO)价格飙升:它可以达到3美元的目标吗?

    jito(jto)近期经历了价格上升,并在sol strategies的支持下进一步推动了涨势。它能否维持动能并触及3美元的目标,还是会遭遇看跌压力? 你听说过Crackin’吗,加密伙伴们?Jito(JTO)最近可是频频出圈,大家都在热议:它是否能继续狂欢并冲上那个诱人的3美元价位?我…

    2025年12月8日
    000
  • Blockdag,Avalanche,Airdrop:通过创新策略摇动加密货币场景

    加密货币行业正在经历一场变革,用户参与度和实际应用场景的重要性逐渐超越了单纯的概念炒作。blockdag近期的战略性空投与快速增长正是这一趋势的体现。 加密世界总是充满活力,最近,BlockDag凭借其独特的空投策略引发了广泛关注,其发展势头让人联想到雪崩早期的成功轨迹。我们不妨来看看这些项目是如何…

    2025年12月8日
    000
  • HEDERA价格:解码技术信号和上升潜力

    分析hedera(hbar)的价格波动,技术指标与未来增长前景。hbar是否即将迎来突破,还是会遭遇新的抛压? HEDERA价格:解读技术信号与上涨潜力 Hedera(HBAR)正经历复杂的市场环境,近期的价格变化引起了投资者的关注。是新一轮上涨趋势即将到来,还是HBAR将面临进一步的盘整?我们来深…

    2025年12月8日
    000
  • PI网络,新功能和PI2DAY:它会恢复Pi硬币吗?

    pi network在pi2day之前推出了新功能,包括ai集成和生态系统积分,但这些更新能否扭转pi coin近期的价格下跌趋势? PI网络、新功能与PI2DAY:是否能重振Pi币价值? 随着PI2DAY的临近,PI网络正引发热议,社区中充满了期待与疑问。AI整合、生态系统积分以及KYC流程的优化…

    2025年12月8日
    000
  • 声音战斗:导航钥匙阻力和下降谨慎

    sonic($ s)在下行趋势中遭遇关键阻力考验。唯有价格站稳$ 0.32上方,才可能扭转当前情绪。建议投资者对做多保持谨慎。 声波之战:直击核心阻力与看跌预警 当下Sonic正深陷持续下跌趋势的泥潭。从声波之战的格局来看,关键阻力位的争夺成为关注焦点。这枚代币正处于命运转折点,能否实现突围仍是未知…

    2025年12月8日
    000
  • 双子座的欧盟发射:代币的股票彻底改变了美国股票的机会

    gemini在欧盟推出的代币化微观票据(mstr)股票标志着一个关键时刻,通过区块链技术实现全天候访问美国股市,将传统金融与加密货币融合在一起。 嘿,投资爱好者们!你是否曾梦想过轻松地参与美国股市而无需面对繁琐流程?Gemini刚刚在欧盟做出了一项重大动作——推出代币化股票。我们一起来看看这是怎么回…

    2025年12月8日
    000
  • 区块链趋势2025:Altcoins和最佳观看项目(也许可以购买!)

    潜入2025年区块链景观:探索顶级山寨币趋势,涵盖现实世界资产代币化和跨链互操作性。 加密爱好者们,让我们一起踏上旅程。2025年的区块链世界已经不再只是关于炒作。它更注重实际功能、稳定的技术以及真正能带来改变的项目。那么,目前哪些领域最值得关注?哪些山寨币值得追踪?我们一起来看看。 区块链格局:2…

    2025年12月8日
    100
  • 比特币与Google:加密司法公正?

    比特币的市值已超越google,标志着投资重心的转移,也成为了加密货币领域的“诗意正义”时刻。 比特币终于获得应有的认可了吗?今年多次击败字母公司(Google母公司)的市值表现,似乎预示着一个转折点的到来。让我们深入探讨这一“加密正义”背后的含义。 比特币的崛起:一场“诗意的正义” Vaneck的…

    2025年12月8日
    000
  • 2025年币圈优质交易所App排名 2025币圈交易平台排行榜

    进入2025年,数字资产市场持续演变,各类%ignore_a_2%为全球用户提供了多样化的服务。一个功能全面、安全可靠的交易所App对于用户管理和交易其数字资产至关重要。评判一个交易平台的优劣涉及多个维度,包括平台的流动性、资产多样性、产品创新能力、安全风控体系以及客户服务的质量。本篇文章将详细梳理…

    2025年12月8日 好文分享
    100
  • 破解加密预售代码:2025年的ROI潜力

    在2025年探索加密货币预售领域以获取最大投资回报。掌握核心趋势、深度洞察以及可能带来高增长的项目机会。 加密市场正充满活力,精明投资者总在寻找下一个风口。预售为早期参与潜力项目提供了窗口,正逐渐成为实现高额回报的重要渠道。让我们一同分析2025年主导该领域的趋势与见解。 预售:挖掘投资潜力的前沿 …

    2025年12月8日
    100
  • SUI的趋势激增:解码炒作背后的原因

    sui转过头!该博客文章介绍了sui趋势状态的原因,从现实世界的资产集成到defi的进步。 SUI热潮飙升:解析背后推动力 SUI正成为加密圈的热门话题,这一切并非偶然!从创新性的整合到稳定的交易量增长,SUI生态正在蓬勃发展。让我们一起探讨SUI为何如此火爆及其背后的深意。 实体资产与艺术结合:S…

    2025年12月8日
    000
  • Robinhood的加密衍生品玩:大众的微观未来?

    robinhood正通过推出xrp、solana和bitcoin的微型期货合约,推动加密衍生品走向大众化。这是否真的能改变散户投资者的游戏规则? 这一次,Robinhood再次在加密领域掀起波澜,这次的焦点是衍生品市场。他们正在推出针对XRP、Solana以及Bitcoin的微型期货产品,使普通用户…

    2025年12月8日
    000
  • 加密货币预售将于2025年爆炸:Magacoin财务领导了费用

    加密货币市场迎来新风口,2025年或将见证预售热潮爆发。magacoin finance成为领头羊,揭示未来增长的潜力与趋势。 2025年加密货币预售即将爆发:Magacoin Finance引领风潮 加密货币领域正逐步升温,焦点集中于即将到来的2025年。业内专家纷纷预测,加密货币预售将迎来一波前…

    2025年12月8日
    000
  • 导航AI加密景观:Bittensor,Griffain和Agent Revolution

    探索ai与加密货币的结合,深入了解bittensor(tao)、griffain(griffain)以及区块链中ai代理的崛起。把握关键趋势和潜在投资机会。 驾驭AI与加密交汇领域:Bittensor、Griffain与代理革命 人工智能(AI)与区块链技术的融合正催生出新一代加密项目。这些并非传统…

    2025年12月8日
    000
  • 2025年加密:Web3 AI如何统治

    为2025年加密牛市来临做好准备!web3 ai凭借其ai赋能工具助力智能加密投资。 2025年的加密市场正引发广泛关注,其中一项新兴趋势正在崭露头角:Web3 AI。让我们一探究竟,为何Web3 AI或将成为开启财富增长的关键所在。 2025年加密牛市:多重因素酝酿的爆发 业内专家普遍认为,202…

    2025年12月8日
    000
  • 币圈排名靠前的交易所 虚拟币交易额大的平台有哪些

    在数字资产的世界里,加密货币交易所扮演着至关重要的角色。它们是连接用户与广阔加密市场的核心桥梁,提供了一个买卖、交易和管理数字货币的平台。这些平台的发展极大地推动了数字资产的普及和流动,使得个人投资者和机构都能够便捷地参与到这一新兴领域中。一个优秀的交易所通常具备高流动性、丰富的交易对、强大的安全保…

    2025年12月8日
    000
  • 2025年币圈交易所App排行榜 2025交易所前十排行榜

    进入2025年,数字资产市场持续演变,各类交易平台的功能与服务也在不断迭代升级。对于广大用户而言,选择一个功能全面、安全可靠并且体验流畅的交易所App显得尤为关键。一个优秀的交易平台不仅需要提供丰富的资产选择和深厚的交易流动性,更要在安全风控、技术支持和用户服务等多个维度上表现出色。这份排行榜旨在梳…

    2025年12月8日 好文分享
    000

发表回复

登录后才能评论
关注微信