public enum BackTracking
{
UP,
LEFT,
NEITHER,
UP_AND_LEFT
} public abstract class LCSBaseMatch
{
/// <summary>
/// 设置连续字符的匹配值
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
protected virtual int ConsecutiveMeasure(int length)
{
return length * length;
} /// <summary>
/// 获取两个string字符串的匹配度
/// </summary>
/// <param name="list1"></param>
/// <param name="list2"></param>
/// <returns></returns>
public virtual int GetMatchScoreOfLCS(char[] list1, char[] list2)
{
int[,] lcs;//最大匹配度
BackTracking[,] backTracer;//需要执行的操作 int score = GetMatchScoreOfLCS(list1, list2, out lcs, out backTracer);//最终匹配度
return score;
} /// <summary>
/// 计算匹配度
/// </summary>
/// <param name="list1"></param>
/// <param name="list2"></param>
/// <param name="lcs"></param>
/// <param name="backTracer"></param>
/// <returns></returns>
protected int GetMatchScoreOfLCS(char[] list1, char[] list2, out int[,] lcs, out BackTracking[,] backTracer)
{
int m = list1.Length;
int n = list2.Length; lcs = new int[m, n];//最大匹配度
backTracer = new BackTracking[m, n];//需要执行的操作
int[,] w = new int[m, n];//连续匹配的长度
int i, j; #region 初始化lcs、backTracer
for (i = 0; i < m; ++i)
{
lcs[i, 0] = 0;
backTracer[i, 0] = BackTracking.UP;
}
for (j = 0; j < n; ++j)
{
lcs[0, j] = 0;
backTracer[0, j] = BackTracking.LEFT;
}
#endregion #region 给lcs、backTracer、w赋值
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (list1[i] == list2[j])
{
int k = 0;
int prev = 0;
if (i > 0 && j > 0)
{
k = w[i - 1, j - 1];
prev = lcs[i - 1, j - 1];
}
//eviation unit between k+1 and k instead of 1 in basic LCS
lcs[i, j] = prev + ConsecutiveMeasure(k + 1) - ConsecutiveMeasure(k);
backTracer[i, j] = BackTracking.UP_AND_LEFT;
w[i, j] = k + 1;
}
if (i > 0 && (lcs[i - 1, j] > lcs[i, j]))
{
lcs[i, j] = lcs[i - 1, j];
backTracer[i, j] = BackTracking.UP;
w[i, j] = 0;
}
if (j > 0 && (lcs[i, j - 1] > lcs[i, j]))
{
lcs[i, j] = lcs[i, j - 1];
backTracer[i, j] = BackTracking.LEFT;
w[i, j] = 0;
}
}
}
#endregion return lcs[m - 1, n - 1];//最终匹配度
} } public class LCSMatchForString : LCSBaseMatch
{
/// <summary>
/// get The Longest Common Substring
/// </summary>
/// <param name="list1"></param>
/// <param name="list2"></param>
/// <returns></returns>
public string LCS(string s1, string s2)
{
char[] list1 = s1.ToArray();
char[] list2 = s2.ToArray();
int m = list1.Length;
int n = list2.Length; int[,] lcs ;//最大匹配度
BackTracking[,] backTracer ;//需要执行的操作 int score = GetMatchScoreOfLCS(list1,list2,out lcs,out backTracer);//最终匹配度 #region 获取最大匹配的字符串
int i = m - 1;
int j = n - 1;
string subseq = "";
//trace the backtracking matrix.
while (i >=0 && j >=0)
{
if (backTracer[i, j] == BackTracking.NEITHER) break;
if (backTracer[i, j] == BackTracking.UP_AND_LEFT)
{
subseq = list1[i]+ subseq;
i--;
j--;
}
else if (backTracer[i, j] == BackTracking.UP)
{
i--;
}
else if (backTracer[i, j] == BackTracking.LEFT)
{
j--;
}
}
#endregion return subseq;
}
}

  

最大匹配字符串LCS,The Longest Common Substring的更多相关文章

  1. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  2. 最长公共子串LCS(Longest Common Substring)

    一.问题描述 寻求两个字符串中的最大公共字串,其中子串是指字符串中连续的字符组成的,而不是像子序列,按照字符的前后顺序组成.如str1="sgabacbadfgbacst",str ...

  3. SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)

    1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...

  4. LCS2 - Longest Common Substring II(spoj1812)(sam(后缀自动机)+多串LCS)

    A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...

  5. spoj 1811 LCS - Longest Common Substring (后缀自己主动机)

    spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2 ...

  6. SPOJ1812 LCS2 - Longest Common Substring II【SAM LCS】

    LCS2 - Longest Common Substring II 多个字符串找最长公共子串 以其中一个串建\(SAM\),然后用其他串一个个去匹配,每次的匹配方式和两个串找\(LCS\)一样,就是 ...

  7. spoj1811 LCS - Longest Common Substring

    地址:http://www.spoj.com/problems/LCS/ 题面: LCS - Longest Common Substring no tags  A string is finite ...

  8. 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring

    LCS - Longest Common Substring no tags  A string is finite sequence of characters over a non-empty f ...

  9. 【SP1811】LCS - Longest Common Substring

    [SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...

随机推荐

  1. APIView源码解析

    1.首先安装pip install djangorestframework 2.导入from rest_framework.views import APIView class Courses(API ...

  2. python selenium设置chrome的下载路径

    python可以通过ChromeOptions设置chrome参数,如下载路径等,代码如下(python 3.6.7): #-*-coding=utf-8-*- from selenium impor ...

  3. flask 表单

    表单 在Web程序中,表单时和用户交互最常见的方式之一.用户注册.登录.撰写文章.编辑设置,无一不用到表单.不过,表单的处理不简单.要创建表单,验证用户输入的内容,向用户显示错误提示,还要获取并保存数 ...

  4. bzoj2656 [Zjoi2012]数列(sequence)

    题目链接 好久没写高精度了,调了很久QAQ 如果直接递归计算答案的话肯定会T 发现一个数不管是分成一奇一偶还是直接>>1,都会重复计算很多东西 我们只需要在递归的时候实时维护一个xx(an ...

  5. <转>jmeter(十六)配置元件之计数器

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  6. 怎样从外网访问内网Apache HTTP Server

    本地安装了一个Apache HTTP Server,只能在局域网内访问,怎样从外网也能访问到本地的Apache HTTP Server呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

  7. Python进阶【第十篇】模块(上)

    ·一.模块 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这 ...

  8. js动态添加和删除table的行例子

    <table id="table_report" class="table table-striped table-bordered table-hover&quo ...

  9. nginx的gzip压缩功能

    我们在开发网站的时候,应该要考虑到pv,因为pv比较大可能会造成服务器带宽不够用,进而导致用户体验变差. 这个时候我们就可以考虑用nginx的gzip功能. 在nginx中开启gzip压缩功能很简单, ...

  10. svn钩子

    #!/bin/sh #修改为服务编码 export.UTF-8 #Set variable REPOS="$1" REV="$2" #svn安装脚本目录 SVN ...