Bạn có thể làm điều đó trong thời gian O (N * log (N)) thời gian:
Want: abcdefgh12345678 -> a1b2c3d4e5f6g7h8
a b c d e f g h
1 2 3 4 5 6 7 8
4 1-sized swaps:
a 1 c 3 e 5 g 7
b 2 d 4 f 6 h 8
a1 c3 e5 g7
b2 d4 f6 h8
2 2-sized swaps:
a1 b2 e5 f6
c3 d4 g7 h8
a1b2 e5f6
c3d4 g7h8
1 4-sized swap:
a1b2 c3d4
e5f6 g7h8
a1b2c3d4
e5f6g7h8
thực hiện trong C:
#include <stdio.h>
#include <string.h>
void swap(void* pa, void* pb, size_t sz)
{
char *p1 = pa, *p2 = pb;
while (sz--)
{
char tmp = *p1;
*p1++ = *p2;
*p2++ = tmp;
}
}
void interleave(char* s, size_t len)
{
size_t start, step, i, j;
if (len <= 2)
return;
if (len & (len - 1))
return; // only power of 2 lengths are supported
for (start = 1, step = 2;
step < len;
start *= 2, step *= 2)
{
for (i = start, j = len/2;
i < len/2;
i += step, j += step)
{
swap(s + i,
s + j,
step/2);
}
}
}
char testData[][64 + 1] =
{
{ "Aa" },
{ "ABab" },
{ "ABCDabcd" },
{ "ABCDEFGHabcdefgh" },
{ "ABCDEFGHIJKLMNOPabcdefghijklmnop" },
{ "ABCDEFGHIJKLMNOPQRSTUVWXYZ0<({[/abcdefghijklmnopqrstuvwxyz1>)}]\\" },
};
int main(void)
{
unsigned i;
for (i = 0; i < sizeof(testData)/sizeof(testData[0]); i++)
{
printf("%s -> ", testData[i]);
interleave(testData[i], strlen(testData[i]));
printf("%s\n", testData[i]);
}
return 0;
}
Output (ideone):
Aa -> Aa
ABab -> AaBb
ABCDabcd -> AaBbCcDd
ABCDEFGHabcdefgh -> AaBbCcDdEeFfGgHh
ABCDEFGHIJKLMNOPabcdefghijklmnop -> AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPp
ABCDEFGHIJKLMNOPQRSTUVWXYZ0<({[/abcdefghijklmnopqrstuvwxyz1>)}]\ -> AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz01<>(){}[]/\
Nguồn
2013-04-14 08:08:30
Đây không phải là giải pháp hiệu quả, nhưng đó là một sự khởi đầu. Điều gì về một thuật toán giải quyết hai ký tự đầu tiên 'a1', sửa mảng và sau đó lặp lại với mảng nhỏ hơn. Rõ ràng nó không thực hiện được vì việc 'abcdef123456' thành' a1bcdef23456' không thể hiệu quả (trừ khi chuỗi được biểu diễn dưới dạng danh sách liên kết?). Bạn có yêu cầu gì về thời gian chạy? Hay bạn chỉ đang tìm kiếm một thuật toán thông minh? – rliu
Chuỗi của bạn có phải là một mảng hoặc một danh sách được liên kết không? –
Có vẻ như đó là một số loại trình tự xây dựng tương tự nhau mà hai nửa còn lại nhận được. Tôi phải đi nhà thờ, nhưng tôi có những ghi chú của tôi ở đây: http://pastebin.com/nBQf4q90 Hầu hết chỉ quan sát những bước di chuyển bạn cần thay đổi khi độ dài thay đổi. Tôi nghĩ nếu bạn kéo dài thêm một chút thì mối quan hệ sẽ trở nên rõ ràng hơn. – Patashu