Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#18

AW: Muster in String

  Alt 29. Nov 2015, 09:40
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.
  Mit Zitat antworten Zitat