(Gast)
n/a Beiträge
|
AW: Muster in String
28. Nov 2015, 12:41
Der Ansatz von Sir Rufo führt auf jedem Fall zum Ziel. Meine Rechnung (wenn sie denn stimmt) zeigt, das Brute Force bei nicht zu langen Zeichenketten durchaus funktionieren könnte. Natürlich kann man die Kandidaten eingrenzen. Hier ein Ansatz in C#
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 Find(int minSubLength, int maxSubLength)
{
for (int subLength = minSubLength; subLength <= maxSubLength; subLength++)
ScanPattern(_text1, "", 0, subLength);
}
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);
}
}
}
Verwendung
Code:
var matcher = new VariationMatcher ("a1b2cd3ef","ghi1j2kl3");
matcher.Find (3,3); // Nur pattern der Länge 3
Console.Writeln(string.Join ("\r\n",matcher.Patterns);
Edit: Sorry, kein Delphi zur Hand. sollte 1:1 in Delphi übersetzbar sein.
Geändert von Dejan Vu (28. Nov 2015 um 12:49 Uhr)
|
|
Zitat
|