Advertisement
mabu

Генерация строк по маске

Aug 27th, 2015
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ' Строка со всеми символами
  2. Public sb As New StringBuilder
  3.  
  4. ' Узел дерева
  5. Public Class Node
  6.     ' Глубина вложенности
  7.     Public Level As Integer
  8.     ' Список букв
  9.     Public Symbol As Char
  10.     ' Список потомков
  11.     Public Nodes As List(Of Node)
  12. End Class
  13.  
  14. ' Добавление узлов на самое дно
  15. Public Sub AddNodes(ByVal CurrentNode As Node, ByVal colNodes As List(Of Node))
  16.     If CurrentNode.Nodes Is Nothing Then
  17.         ' Это уже дно, добавляем массив узлов сюда
  18.         With CurrentNode
  19.             .Nodes = New List(Of Node)
  20.             For Each o In colNodes
  21.                 .Nodes.Add(New Node With {.Symbol = o.Symbol, .Level = CurrentNode.Level + 1})
  22.             Next
  23.         End With
  24.     Else
  25.         ' Это не дно. Нужно добавить каждому узлу массив
  26.         For Each node In CurrentNode.Nodes
  27.             AddNodes(node, colNodes)
  28.         Next
  29.     End If
  30. End Sub
  31.  
  32. Public Function PrintTree(ByVal CurrentNode As Node, ByVal PatternLength As Integer) As Boolean
  33.     ' У узла нет потомков, мы на дне
  34.     If CurrentNode.Nodes Is Nothing Then
  35.         If CurrentNode.Level = PatternLength Then
  36.             sb.Append(CurrentNode.Symbol)
  37.         End If
  38.         ' Возвращаем сигнал, что нет потомков
  39.         Return True
  40.     Else
  41.         ' Если у узла нет потомком, удаляем из дерева
  42.         If PrintTree(CurrentNode.Nodes.Item(0), PatternLength) Then
  43.             CurrentNode.Nodes.RemoveAt(0)
  44.             ' Если текущая коллекция узлов пуста, удаляем
  45.             If CurrentNode.Nodes.Count = 0 Then
  46.                 CurrentNode.Nodes = Nothing
  47.             End If
  48.         End If
  49.         ' Распечатать текущий узел
  50.         sb.Append(CurrentNode.Symbol)
  51.         Return False
  52.     End If
  53. End Function
  54.  
  55. Public Function Main(ByVal Args() As String)As Integer
  56.     ' Вот строка-маска
  57.     Dim strPattern As String = "$$$hello№№"
  58.     Dim a1() As Char = {"a"c, "b"c, "c"c}
  59.     Dim a2() As Char = {"1"c, "2"c, "3"c}
  60.    
  61.     ' Нужно строить дерево, начальное значение узла — пробел
  62.     Dim tree As New Node With {.Symbol = " "c}
  63.     For Each c As Char In strPattern
  64.         Select Case c
  65.             Case "$"c
  66.                 ' Добавить в дерево массив узлов a1
  67.                 Dim colNodes As New List(Of Node)
  68.                 For Each c1 As Char In a1
  69.                     colNodes.Add(New Node With {.Symbol = c1})
  70.                 Next
  71.                 AddNodes(tree, colNodes)
  72.             Case "№"c
  73.                 ' Добавить в дерево массив узлов a2
  74.                 Dim colNodes As New List(Of Node)
  75.                 For Each c1 As Char In a2
  76.                     colNodes.Add(New Node With {.Symbol = c1})
  77.                 Next
  78.                 AddNodes(tree, colNodes)
  79.             Case Else
  80.                 ' Добавить в дерево массив узлов
  81.                 Dim colNodes As New List(Of Node)
  82.                 colNodes.Add(New Node With {.Symbol = c})
  83.                 AddNodes(tree, colNodes)
  84.         End Select
  85.     Next
  86.     ' Собрать буквы из дерева в строку
  87.     Dim rRet As Boolean
  88.     Do
  89.         rRet = PrintTree(tree, strPattern.Length)
  90.     Loop Until rRet
  91.     ' Собранную строку разбить по пробелам и взять только нужное
  92.     Dim strList = sb.ToString.Split.Where(Function(s) s.Length = strPattern.Length)
  93.     ' Распечатка
  94.     For Each s In strList
  95.         Console.WriteLine(New String(s.Reverse.ToArray))
  96.     Next
  97.    
  98.     Return 0
  99. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement