. , , . , - 2^30
30, , , , 30 choose 15 = 155117520
15 . 150 - .
, start
, , , end
. , . :
start = '10101010'
end = '00101011'
dp = [{} for _ in range(31)]
dp[1][start] = ''
for i in range(2, len(start) + 1):
for s in dp[i - 1].keys():
for j in range(len(start) - i + 1):
newstr = s
newstr = newstr[:j] + newstr[j:j+i][::-1] + newstr[j+i:]
dp[i][newstr] = s
if end in dp[i]:
ans = []
cur = end
for j in range(i, 0, -1):
ans.append(cur)
cur = dp[j][cur]
print(ans[::-1])
exit(0)
print('Impossible!')
['10101010', '10101001', '10101100', '10100011', '00101011']
- str1 str2. , , . , 4 , 7, .
, 30 python, C++, .