Hat jemand mal meine Klasse aus probiert? Wenn man die etwas umschreibt, bekommt man tatsächlich die längsten Variationen (nein, keine Substrings, keine Muster, schlicht und ergreifend und mathematisch korrekt: Variationen) zweier Zeichenketten.
Code:
internal class VariationMatcher
{
private readonly string _text1;
private readonly string _text2;
private readonly List<string> _patterns=new List<string>();
public IEnumerable<string> Patterns { get { return _patterns; } }
public VariationMatcher(string text1, string text2)
{
this._text1 = text1;
this._text2 = text2;
}
public void FindLongestVariation()
{
for (int subLength = _text.Length; subLength >2; subLength--)
{
ScanPattern(_text1, "", 0, subLength);
if (_Patterns.Any())
return;
}
}
private void ScanPattern(string text, string pattern, int i, int remaining)
{
if (remaining == 0)
{
FindPattern(_text2, pattern,"",0);
}
else
for (int j = i; j <= text.Length - remaining; j++)
ScanPattern(text, pattern + text[j], j + 1, remaining - 1);
}
private void FindPattern(string text, string patternToMatch, string pattern, int i)
{
if (pattern.Length == patternToMatch.Length)
_patterns.Add(pattern);
else
{
char charToMatch = patternToMatch[pattern.Length];
for (int j = i; j <= text.Length - patternToMatch.Length + pattern.Length; j++)
if (text[j] == charToMatch)
FindPattern(text, patternToMatch, pattern + charToMatch, j + 1);
}
}
}
Nun nur noch 'FindLongestVariation' aufrufen und sich das Ergebnis in 'Patterns' anschauen.