Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ' Строка со всеми символами
- Public sb As New StringBuilder
- ' Узел дерева
- Public Class Node
- ' Глубина вложенности
- Public Level As Integer
- ' Список букв
- Public Symbol As Char
- ' Список потомков
- Public Nodes As List(Of Node)
- End Class
- ' Добавление узлов на самое дно
- Public Sub AddNodes(ByVal CurrentNode As Node, ByVal colNodes As List(Of Node))
- If CurrentNode.Nodes Is Nothing Then
- ' Это уже дно, добавляем массив узлов сюда
- With CurrentNode
- .Nodes = New List(Of Node)
- For Each o In colNodes
- .Nodes.Add(New Node With {.Symbol = o.Symbol, .Level = CurrentNode.Level + 1})
- Next
- End With
- Else
- ' Это не дно. Нужно добавить каждому узлу массив
- For Each node In CurrentNode.Nodes
- AddNodes(node, colNodes)
- Next
- End If
- End Sub
- Public Function PrintTree(ByVal CurrentNode As Node, ByVal PatternLength As Integer) As Boolean
- ' У узла нет потомков, мы на дне
- If CurrentNode.Nodes Is Nothing Then
- If CurrentNode.Level = PatternLength Then
- sb.Append(CurrentNode.Symbol)
- End If
- ' Возвращаем сигнал, что нет потомков
- Return True
- Else
- ' Если у узла нет потомком, удаляем из дерева
- If PrintTree(CurrentNode.Nodes.Item(0), PatternLength) Then
- CurrentNode.Nodes.RemoveAt(0)
- ' Если текущая коллекция узлов пуста, удаляем
- If CurrentNode.Nodes.Count = 0 Then
- CurrentNode.Nodes = Nothing
- End If
- End If
- ' Распечатать текущий узел
- sb.Append(CurrentNode.Symbol)
- Return False
- End If
- End Function
- Public Function Main(ByVal Args() As String)As Integer
- ' Вот строка-маска
- Dim strPattern As String = "$$$hello№№"
- Dim a1() As Char = {"a"c, "b"c, "c"c}
- Dim a2() As Char = {"1"c, "2"c, "3"c}
- ' Нужно строить дерево, начальное значение узла — пробел
- Dim tree As New Node With {.Symbol = " "c}
- For Each c As Char In strPattern
- Select Case c
- Case "$"c
- ' Добавить в дерево массив узлов a1
- Dim colNodes As New List(Of Node)
- For Each c1 As Char In a1
- colNodes.Add(New Node With {.Symbol = c1})
- Next
- AddNodes(tree, colNodes)
- Case "№"c
- ' Добавить в дерево массив узлов a2
- Dim colNodes As New List(Of Node)
- For Each c1 As Char In a2
- colNodes.Add(New Node With {.Symbol = c1})
- Next
- AddNodes(tree, colNodes)
- Case Else
- ' Добавить в дерево массив узлов
- Dim colNodes As New List(Of Node)
- colNodes.Add(New Node With {.Symbol = c})
- AddNodes(tree, colNodes)
- End Select
- Next
- ' Собрать буквы из дерева в строку
- Dim rRet As Boolean
- Do
- rRet = PrintTree(tree, strPattern.Length)
- Loop Until rRet
- ' Собранную строку разбить по пробелам и взять только нужное
- Dim strList = sb.ToString.Split.Where(Function(s) s.Length = strPattern.Length)
- ' Распечатка
- For Each s In strList
- Console.WriteLine(New String(s.Reverse.ToArray))
- Next
- Return 0
- End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement