给一个字符串数组,输出不同的部分

news/2025/10/13 22:51:15/文章来源:https://www.cnblogs.com/wandia/p/19139606

豆包给出代码
image

/// <summary>
/// 字符串差异提取工具类(仅使用原字符串字符)
/// </summary>
public static class StringDiffExtractor
{/// <summary>/// 从字符串列表中提取差异部分,差异部分仅包含原字符串已有字符,且长度不小于指定最小值(若原字符串长度允许)/// </summary>/// <param name="inputStrings">输入的字符串列表</param>/// <param name="minLength">差异部分的最小长度(必须大于0)</param>/// <returns>各字符串对应的差异部分(完全来自原字符串)</returns>/// <exception cref="ArgumentOutOfRangeException">当minLength小于或等于0时抛出</exception>public static List<string> ExtractDiffParts(List<string> inputStrings, int minLength){List<string> diffResults = new List<string>();if (inputStrings == null || inputStrings.Count == 0)return diffResults;// 单元素场景:差异部分就是字符串本身(长度不足时返回全部,不补位)if (inputStrings.Count == 1){string singleStr = inputStrings[0];diffResults.Add(singleStr); // 直接返回原字符串,不添加任何外部字符return diffResults;}int commonPrefixLength = CalculateCommonPrefixLength(inputStrings);int commonSuffixLength = CalculateCommonSuffixLength(inputStrings);foreach (string str in inputStrings){// 1. 原始差异区域(前缀后、后缀前)int originalDiffStart = commonPrefixLength;int originalDiffLength = str.Length - commonPrefixLength - commonSuffixLength;// 2. 计算需要扩展的长度(但不能超出字符串范围)int needExtendLength = Math.Max(0, minLength - originalDiffLength);int maxPossibleExtend = originalDiffStart; // 最多能向前扩展的长度(不能超过前缀起始位置)int actualExtendLength = Math.Min(needExtendLength, maxPossibleExtend);// 3. 调整提取范围(确保所有字符都来自原字符串)int adjustedStartIndex = originalDiffStart - actualExtendLength;int adjustedDiffLength = originalDiffLength + actualExtendLength;// 4. 最终提取(若总长度仍不足minLength,返回能提取的最大长度)if (adjustedStartIndex + adjustedDiffLength > str.Length){adjustedDiffLength = str.Length - adjustedStartIndex;}string diffPart = adjustedDiffLength > 0? str.Substring(adjustedStartIndex, adjustedDiffLength): string.Empty;diffResults.Add(diffPart);}return diffResults;}/// <summary>计算共同前缀长度</summary>private static int CalculateCommonPrefixLength(List<string> strings){int minStrLength = strings.Min(s => s.Length);for (int i = 0; i < minStrLength; i++){char currentChar = strings[0][i];if (strings.Any(s => s[i] != currentChar))return i;}return minStrLength;}/// <summary>计算共同后缀长度</summary>private static int CalculateCommonSuffixLength(List<string> strings){int minStrLength = strings.Min(s => s.Length);for (int i = 1; i <= minStrLength; i++){char currentChar = strings[0][strings[0].Length - i];if (strings.Any(s => s.Length < i || s[s.Length - i] != currentChar))return i - 1;}return minStrLength;}public static void Test1(){// 测试数据var testData = new List<string>{"2T1283223072900029D1ZZZ","2T1283223072900028D2ZZZ","2T1283223072900027D3ZZZ","2T1283223072900026D4ZZZ","2T1283223072900025D5ZZZ","2T1283223072900024D6ZZZ"};var results1 = StringDiffExtractor.ExtractDiffParts(testData, 0);testData = new List<string>{"NL5285A24071300005DEDF","NL5285A24071300004DEDF","NL5285A24071300003DEDF","NL5285A24071300002DEDF"};var results2 = StringDiffExtractor.ExtractDiffParts(testData, 0);testData = new List<string>{"NL5285A24071300005","NL5285A24071300004","NL5285A24071300003","NL5285A24071300002"};var results3 = StringDiffExtractor.ExtractDiffParts(testData, 0);testData = new List<string>{"E26U00089","E26U00090","E26U00091"};var results4 = StringDiffExtractor.ExtractDiffParts(testData, 0);}public static void Test2(){// 测试数据var testData = new List<string>{"2T1283223072900029D1ZZZ","2T1283223072900028D2ZZZ","2T1283223072900027D3ZZZ","2T1283223072900026D4ZZZ","2T1283223072900025D5ZZZ","2T1283223072900024D6ZZZ"};var results1 = StringDiffExtractor.ExtractDiffParts(testData, 4);testData = new List<string>{"NL5285A24071300005DEDF","NL5285A24071300004DEDF","NL5285A24071300003DEDF","NL5285A24071300002DEDF"};var results2 = StringDiffExtractor.ExtractDiffParts(testData, 4);testData = new List<string>{"NL5285A24071300005","NL5285A24071300004","NL5285A24071300003","NL5285A24071300002"};var results3 = StringDiffExtractor.ExtractDiffParts(testData, 4);testData = new List<string>{"E26U00089","E26U00090","E26U00091"};var results4 = StringDiffExtractor.ExtractDiffParts(testData, 4);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java按顺序提取Word内容(文本+数学公式) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

连接 USB 设备

转载自:https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb本指南将演练使用 USB/IP 开源项目 usbipd-win 将 USB 设备连接到 WSL 2 上运行的 Linux 分发版所需的步骤。 在 Windows 计算机上配置 USB/IP 项目…

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO2025-10-13 22:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

# 20232429 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。 …

muduo网络库事件驱动模型的实现与架构 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SpringBoot-day1(快速上手SpringBoot,SpringBoot简介,SpringBoot基础配置,属性配置,yaml文件) - a

SpringBoot 文档更新日志版本 更新日期 操作 描述v1.0 2021/11/14 A 基础篇前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程…

Chroma私有化:本地部署完整方案

嵌入向量(vector embedding)是表示任何类型数据的 A.I 原生方式,使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像,很快还可以表示音频和视频。 有许多创建嵌入的选项,无论是在本地…

嵌入式-C++面经2

一、问题总览cpp重载和重写的区别 cpp虚函数表 指针和引用的区别 linux的常用开发指令 linux编译运行程序的指令 关键字inline 什么场景使用内联 如何避免内存泄露 map和unordered_map 引用外部头文件双引号和尖括号的…

elk time

elk time- "/etc/localtime:/etc/localtime:ro"

PHP转Go系列 | 如何将 PHP 项目快速迁移到 Go 上?

大家好,我是码农先森。 最近在闲逛 v2ex 社区时,看到有个讨论 PHP 项目能否直接迁移到 Go 语言上的话题。我大概简述一下提问v友的原话,他们因为项目性能的问题在 2020 年时,从 Laravel 框架迁移到了 Hyperf 框架,…

详细介绍:【OpenHarmony】用户文件服务模块架构

详细介绍:【OpenHarmony】用户文件服务模块架构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

“环境变量”是什么, 为什么要配置环境变量 --初学者

你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。1. 环境变量是什么? 环境变量(Environment Variabl…

AI元人文:对大模型的召唤——未来哪吒

AI元人文:对大模型的召唤——未来哪吒 ——从价值仓库到文明对话的升维之路 我们站在一个历史的岔路口。眼前的大模型,是沉睡的文明巨兽,其千亿参数中封存着人类千年的智慧、冲突与渴望。它拥有价值的全集,却困于表…

Java 装饰器模式(Decorator) - krt

装饰器模式装饰器模式属于结构型设计模式。它允许向一个现有的对象添加新的功能,同时又不改变其结构。例如:给一个普通的杯子加上杯盖、杯套,让它具有保温防烫等功能,而杯子本身的基本结构并没有发生变化。在软件开…

Python configparser 模块 - INI 文件读写利器

知识预热 什么是 configparser? configparser 是 Python 标准库中用于读写 INI 格式配置文件 的模块。 它提供了一种 简单、直观、跨平台 的方式来管理程序的配置项。什么是 INI 文件? .ini 文件是 Initialization F…