C#,最大公共子序列(LCS,Longest Common Subsequences)的算法与源代码

1 最大公共子序列

最长的常见子序列问题是寻找两个给定字符串中存在的最长序列。

最大公共子序列算法,常用于犯罪鉴定、亲子鉴定等等的 DNA 比对。

1.1 子序列

让我们考虑一个序列S=<s1,s2,s3,s4,…,sn>。

一个序列Z=<z1,z2,z3,z4,…,zm>在S上被称为S的子序列,当且仅当它可以从某些元素的S删除中派生出来时。

1.2 公共子序列

假设X和Y是有限元素集上的两个序列。如果Z是X和Y的子序列,我们可以说Z是X和Y的公共子序列。

1.3 最长公共子序列

如果给定一组序列,则最长公共子序列问题是找到所有序列中具有最大长度的公共子序列。

最长的常见子序列问题是一个经典的计算机科学问题,是diff实用程序等数据比较程序的基础,在生物信息学中有应用。它还被SVN和Git等版本控制系统广泛用于协调对受版本控制的文件集合所做的多个更改。

2 递归算法源程序

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class StringSearch
    {
        /// <summary>
        /// 两个字符串的最大公共子字符串
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <param name="m"></param>
        /// <param name="n"></param>
        /// <returns></returns>
        public static int LCS_Solve(string X, string Y, int m, int n)
        {
            if (m == 0 || n == 0)
            {
                return 0;
            }
            if (X[m - 1] == Y[n - 1])
            {
                return 1 + LCS_Solve(X, Y, m - 1, n - 1);
            }
            else
            {
                return Math.Max(LCS_Solve(X, Y, m, n - 1), LCS_Solve(X, Y, m - 1, n));
            }
        }
    }
}
 

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class StringSearch{/// <summary>/// 两个字符串的最大公共子字符串/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <param name="m"></param>/// <param name="n"></param>/// <returns></returns>public static int LCS_Solve(string X, string Y, int m, int n){if (m == 0 || n == 0){return 0;}if (X[m - 1] == Y[n - 1]){return 1 + LCS_Solve(X, Y, m - 1, n - 1);}else{return Math.Max(LCS_Solve(X, Y, m, n - 1), LCS_Solve(X, Y, m - 1, n));}}}
}

3 非递归算法源程序

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class StringSearch
    {
        /// <summary>
        /// 计算两个字符串的最大公共子字符串
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <returns></returns>
        public static int LCS_Solve(string X, string Y)
        {
            int m = X.Length;
            int n = Y.Length;
            int[,] LengthArray = new int[m + 1, n + 1];

            for (int i = 0; i <= m; i++)
            {
                for (int j = 0; j <= n; j++)
                {
                    if (i == 0 || j == 0)
                    {
                        LengthArray[i, j] = 0;
                    }
                    else if (X[i - 1] == Y[j - 1])
                    {
                        LengthArray[i, j] = LengthArray[i - 1, j - 1] + 1;
                    }
                    else
                    {
                        LengthArray[i, j] = Math.Max(LengthArray[i - 1, j], LengthArray[i, j - 1]);
                    }
                }
            }
            return LengthArray[m, n];
        }
    }
}

——————————————————————————

POWER BY TRUFFER.CN 50018.COM

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class StringSearch{/// <summary>/// 计算两个字符串的最大公共子字符串/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <returns></returns>public static int LCS_Solve(string X, string Y){int m = X.Length;int n = Y.Length;int[,] LengthArray = new int[m + 1, n + 1];for (int i = 0; i <= m; i++){for (int j = 0; j <= n; j++){if (i == 0 || j == 0){LengthArray[i, j] = 0;}else if (X[i - 1] == Y[j - 1]){LengthArray[i, j] = LengthArray[i - 1, j - 1] + 1;}else{LengthArray[i, j] = Math.Max(LengthArray[i - 1, j], LengthArray[i, j - 1]);}}}return LengthArray[m, n];}}
}

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

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

相关文章

Netty应用(五) 之 Netty引入 EventLoop

目录 第三章 Netty 1.什么是Netty&#xff1f; 2.为什么需要使用Netty&#xff1f; 3.Netty的发展历程 4.谁在使用Netty&#xff1f; 5.为什么上述这些分布式产品都使用Netty&#xff1f; 6.第一个Netty应用 7.如何理解Netty是NIO的封装 8.logback日志使用的加强 9.Ev…

【网站项目】028蜀都天香酒楼管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

腾讯云4核8G服务器可以用来干嘛?怎么收费?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

【数据结构】哈希表的开散列和闭散列模拟实现

哈希思想 在顺序和树状结构中&#xff0c;元素的存储与其存储位置之间是没有对应关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过多次的比较。 顺序查找的时间复杂度为0(N)&#xff0c;树的查找时间复杂度为log(N)。 我们最希望的搜索方式&#xff1a;通过元素…

15 ABC基于状态机的按键消抖原理与状态转移图

1. 基于状态机的按键消抖 1.1 什么是按键&#xff1f; 从按键结构图10-1可知&#xff0c;按键按下时&#xff0c;接点&#xff08;端子&#xff09;与导线接通&#xff0c;松开时&#xff0c;由于弹簧的反作用力&#xff0c;接点&#xff08;端子&#xff09;与导线断开。 从…

【教3妹学编程-算法题】执行操作后的最大分割数量

2哥 : 3妹&#xff0c;今年过年收到压岁钱了没呢。 3妹&#xff1a;切&#xff0c;我都多大了啊&#xff0c;肯定没收了啊 2哥 : 俺也一样&#xff0c;不仅没收到&#xff0c;小侄子小外甥都得给&#xff0c;还倒贴好几千 3妹&#xff1a;哈哈哈哈&#xff0c;2叔叔&#xff0c…

乐观锁,CAS,ABA问题,synchronized锁升级过程

常见的锁策略 乐观锁 vs 悲观锁 乐观锁&#xff1a;乐观锁假设认为数据一般情况下不会产生并发冲突&#xff0c;所以在数据进行提交更新的时候&#xff0c;才会正式对数据是否产生并发冲突进行检测&#xff0c;如果发现并发冲突了&#xff0c;则返回用户错误的信息&#xff0c…

bcdedit /store 填什么,Windows11的BCD文件在哪里?

Windows11为EFI引导&#xff0c;bcd文件在 EFI分区的 \EFI\Microsoft\Boot\BCD 可以选择挂载EFI分区&#xff0c;或者使用如下方式&#xff0c;该路径可充当盘符使用。 例 bcdedit /store Z:\EFI\Microsoft\Boot\BCD /enum /v

javaweb物业管理系统jsp项目

文章目录 物业管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 物业管理系统 可用作javaweb项目、servlet项目、jsp项目的项目设计 一、系统演示 物业管理系统 二、项目介绍 语言&a…

GEE数据集——巴西年度土地覆被和利用地图

巴西年度土地覆被和利用地图 巴西年度土地利用和土地覆被制图项目是一个由生物群落、土地利用、遥感、地理信息系统和计算机科学专家组成的合作网络&#xff0c;依靠谷歌地球引擎平台及其云处理和自动分类功能生成巴西年度土地利用和土地覆被时间序列。MapBiomas 项目--是一项多…

Vue源码系列讲解——模板编译篇【一】(综述)

目录 1. 前言 2. 什么是模板编译 3. 整体渲染流程 4. 模板编译内部流程 4.1 抽象语法树AST 4.2 具体流程 5. 总结 1. 前言 在前几篇文章中&#xff0c;我们介绍了Vue中的虚拟DOM以及虚拟DOM的patch(DOM-Diff)过程&#xff0c;而虚拟DOM存在的必要条件是得先有VNode&…

【蓝桥杯Python】试题 算法训练 P0804

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个函数void strcompress(char *s)&#xff0c;输入一个字符串&#xff08;只包含小写字母和空格&#xff0c;且长度小于1000&…