You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs

58 lines
1.4 KiB
C#

2 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FuzzyString
{
public static partial class ComparisonMetrics
{
public static string LongestCommonSubstring(this string source, string target)
{
if (String.IsNullOrEmpty(source) || String.IsNullOrEmpty(target)) { return null; }
int[,] L = new int[source.Length, target.Length];
int maximumLength = 0;
int lastSubsBegin = 0;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < source.Length; i++)
{
for (int j = 0; j < target.Length; j++)
{
if (source[i] != target[j])
{
L[i, j] = 0;
}
else
{
if ((i == 0) || (j == 0))
L[i, j] = 1;
else
L[i, j] = 1 + L[i - 1, j - 1];
if (L[i, j] > maximumLength)
{
maximumLength = L[i, j];
int thisSubsBegin = i - L[i, j] + 1;
if (lastSubsBegin == thisSubsBegin)
{//if the current LCS is the same as the last time this block ran
stringBuilder.Append(source[i]);
}
else //this block resets the string builder if a different LCS is found
{
lastSubsBegin = thisSubsBegin;
stringBuilder.Length = 0; //clear it
stringBuilder.Append(source.Substring(lastSubsBegin, (i + 1) - lastSubsBegin));
}
}
}
}
}
return stringBuilder.ToString();
}
}
}