Я думаю, вы заблудились в своем 2-мерном списке, который не нужен. Вы можете просто использовать оператор in
, который указывает, что строка может быть найдена в другой. Тогда единственная проблема состоит в том, чтобы создать все подстроки одного из ваших входов.
def sliding_window(seq, width):
"""yields all substrings of `seq` of length `width`"""
return (seq[idx:idx+width] for idx in range(len(seq)-width+1))
def lcw(seq1, seq2):
"""length of the longest common sequence shared by seq1 and seq2"""
max_width = min(len(seq1), len(seq2))
for width in range(max_width, 0, -1):
if any(sub in seq1 for sub in sliding_window(seq2, width)):
return width
return 0
lcw('zxab', 'yzab')
>>>
2
Но это очень хорошо, может быть, я не получил ваше подвое слово определения, которое я действительно не мог отличить от подпоследовательности.
Где я вижу повторение - это структура цикла. Я бы использовал такой код с однострочными условными выражениями, если не важно, какое условие увеличивает переменную счетчика. Вы можете добавить столько условий, сколько хотите, и код остается относительно плоским. Между прочим, хорошо использовать «явную опцию». В первой строке Workbook есть опечатка "Workbok"
Option Explicit
Sub test()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long, count As Long
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then count = count + 1
If Application.CountA(workbook1.Worksheets("Sheet" & i).Range("$C$3:$E$5")) > 0 Then count = count + 1
Next i
End Sub
РЕДАКТИРОВАТЬ:
Вместо того, чтобы использовать разные переменные подсчета, как вы прокомментировали, я бы предпочел иметь все условия счетчики в одном месте. Это можно сделать с помощью массива или словаря.
Использование массива:
Option Explicit
Sub UseOfArray()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long
Dim conditions_in_array(1 To 20) As Long
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_array(1) = conditions_in_array(1) + 1
If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_array(2) = conditions_in_array(2) + 1
Next i
Debug.Print "conditions_in_array(1): "; conditions_in_array(1); vbNewLine; "conditions_in_array(2): "; conditions_in_array(2)
End Sub
Использование словаря (я бы предпочел этот подход, так как с большим количеством условий его легче отлаживать):
Sub UseOfDictionary()
Dim i As Long
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim conditions_in_dict As Scripting.Dictionary
Set conditions_in_dict = New Scripting.Dictionary
conditions_in_dict("cell_IsEmpty") = 0
conditions_in_dict("cell_uncolored") = 0
'here you can enter more keys as conditions as above
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_dict("cell_IsEmpty") = conditions_in_dict("cell_IsEmpty") + 1
If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_dict("cell_uncolored") = conditions_in_dict("cell_uncolored") + 1
Next i
Debug.Print "conditions_in_dict(""cell_IsEmpty""): "; conditions_in_dict("cell_IsEmpty"); vbNewLine; _
"conditions_in_dict(""cell_uncolored""): "; conditions_in_dict("cell_uncolored")
End Sub