Выбор всех возможных двухбуквенных сочетаний из заданной строки

_йцукенг_
Дата: 18.01.2012 17:24:34
Строка содержит только буквы(латиница).
Например, из строки ABC должно вернуться AB, AC, BA, BC, CA, CB. У меня получилось перебирать строку только так:
 For i = 1 To Len(strIn)
        strF1 = Mid(strIn, i, 1)
        For j = i + 1 To Len(strIn)
            strF2 = Mid(strIn, j, 1)
            strK1 = strK1 & ", " & strF1 & strF2
        Next j
    Next i
Debug.Print Left(strK1, Len(strK1) - 1)
При этом возвращается только "AB,AC,BC" из-за того, что переменная второго цикла j всегда указывает на следующий знак в строке.
полином
Дата: 18.01.2012 17:32:23
декартово произведение трех запросов спасут отца русской демократии

Left("ABC";1)
Right("ABC";1)
Instr("ABC";1;1)

разве нет?
Rivkin Dmitry
Дата: 18.01.2012 17:36:20
_йцукенг_
Строка содержит только буквы(латиница).
Например, из строки ABC должно вернуться AB, AC, BA, BC, CA, CB. У меня получилось перебирать строку только так:
 For i = 1 To Len(strIn)
        strF1 = Mid(strIn, i, 1)
        For j = i + 1 To Len(strIn)
            strF2 = Mid(strIn, j, 1)
            strK1 = strK1 & ", " & strF1 & strF2
        Next j
    Next i
Debug.Print Left(strK1, Len(strK1) - 1)
При этом возвращается только "AB,AC,BC" из-за того, что переменная второго цикла j всегда указывает на следующий знак в строке.

А что должно вернуться из строчки "ААА"? "ААБ"?
непоймучка
Дата: 18.01.2012 17:37:48
_йцукенг_
Строка содержит только буквы(латиница).
Например, из строки ABC должно вернуться AB, AC, BA, BC, CA, CB. У меня получилось перебирать строку только так:
 For i = 1 To Len(strIn)
        strF1 = Mid(strIn, i, 1)
        For j = i + 1 To Len(strIn)
            strF2 = Mid(strIn, j, 1)
            strK1 = strK1 & ", " & strF1 & strF2
        Next j
    Next i
Debug.Print Left(strK1, Len(strK1) - 1)
При этом возвращается только "AB,AC,BC" из-за того, что переменная второго цикла j всегда указывает на следующий знак в строке.
уточните - вам надо исключать сочетания букв в одинаковых позициях, или пары одинаковых букв? для вашего примера результат будет одинаков для обоих вариантов правила, но что должно получиться, если в исходной строке буквы будут повторяться?

например - если будет строка "AAA", что должно получиться?
шесть раз "AA" и пустое множество?
_йцукенг_
Дата: 18.01.2012 17:43:55
Сочетания должны быть уникальными(простите, забыл упомянуть), т.е. из слова АВА вернётся "АВ, АА, ВА", а ААА даст только АА(один раз)
непоймучка
Дата: 18.01.2012 17:52:51
_йцукенг_
Сочетания должны быть уникальными(простите, забыл упомянуть), т.е. из слова АВА вернётся "АВ, АА, ВА", а ААА даст только АА(один раз)
а тогда почему
_йцукенг_
из строки ABC должно вернуться AB, AC, BA, BC, CA, CB.

почему тут нет уникальных AA, BB и CC?
_йцукенг_
Дата: 18.01.2012 18:01:19
в образовании сочетаний должны участвовать разные(по позиции, а не по значению) буквы строки, один и тот же знак не может сочетаться сам с собой. Если результаты таких сочетаний создают повтор(текстовый), то он исключается.
_йцукенг_
Дата: 18.01.2012 18:04:32
Хотя...стоп! Я не прав. Может быть сочетание "себя с собой", мне ж надо получить все возможные комбинации. Т.е. из строки ABC должно вернуться АА, AB, AC, BA, ВВ, BC, CA, CB, СС
_йцукенг_
Дата: 18.01.2012 18:08:44
Хм...тогда и вопроса нет:
For i = 1 To Len(strIn)
        strF1 = Mid(strIn, i, 1)
        For j = 1 To Len(strIn)
            strF2 = Mid(strIn, j, 1)
            strK1 = strK1 & ", " & strF1 & strF2
        Next j
    Next i
Debug.Print Left(strK1, Len(strK1) - 1)
непоймучка
Дата: 18.01.2012 18:08:45
_йцукенг_
в образовании сочетаний должны участвовать разные(по позиции, а не по значению) буквы строки, один и тот же знак не может сочетаться сам с собой. Если результаты таких сочетаний создают повтор(текстовый), то он исключается.

понятно, ну как-то так
For i = 1 To Len(strIn)
    strF1 = Mid(strIn, i, 1)
    For j = 1 To Len(strIn)
        If i <> j Then
            strF2 = Mid(strIn, j, 1)
            If InStr(1, strK1, ", " & strF1 & strF2) = 0 Then
                strK1 = strK1 & ", " & strF1 & strF2
            End If
        End If
    Next j
Next i