Сравнить строку с массивом строк и вывести наиболее полные совпадения - Visual Basic .NET
Формулировка задачи:
Доброго времени!
Задачку решил на своем уровне знания, но код получился ППЦ тяжелый, некрасивый, и жрущий память. Помогите переделать/оптимизировать.
Вводные данные: Есть строка, состоящая из нескольких слов (от 1 до 10).
Есть массив из подобных строк.
Есть слова-исключения.
Задача: Сравнить исходную строку с каждой из массива, выбрать те, в которой совпадает максимальное количество слов, не учитывая слова-исключения.
Мой код (постарался максимально откомментировать):
Решение задачи: «Сравнить строку с массивом строк и вывести наиболее полные совпадения»
textual
Листинг программы
Public one_str As String = "Вася ел бутерброд с маслом" ' строка для поиска
Public other_strings() As String = {
"Петя ел кашу с маслом",
"Вася кашу с маслом тоже ел",
"Петя бутерброд с икрой уронил",
"Вася бутерброд с маслом уронил",
"Петя ел бутерброд с маслом"} 'массив строк в которых искать совпадения
Public iskl_word As String() = {"Вася", "Петя"} 'слова не участвующие в поиске, слова-исключения
Public str1 As String = "не найдено"
Private delim As Char = " "c
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim sPattern() As String = exWordDeletion(one_str, iskl_word).Split(delim)
Dim nnS(other_strings.Length - 1) As Integer
Dim sSource As String
For i = 0 To other_strings.Length - 1
sSource = exWordDeletion(other_strings(i), iskl_word)
nnS(i) = sWordEqualCount(sSource, sPattern)
Next
MsgBox("Максимальное число совпадений = " & nnS.Max & vbCrLf & "в строке: " & other_strings(Array.IndexOf(nnS, nnS.Max)))
End Sub
Private Function exWordDeletion(ByVal sSrc As String, ByVal sEx As String()) As String
Dim wSrc() As String = sSrc.Split(delim)
Dim rz() As String = wSrc.Except(sEx).ToArray
Return String.Join(delim, rz)
End Function
Private Function sWordEqualCount(ByVal sSrc As String, ByVal sPtn As String()) As Integer
Dim wSrc() As String = sSrc.Split(delim)
Dim rz() As String = wSrc.Intersect(sPtn).ToArray
Return rz.Count
End Function