Cách tôi sẽ đi về việc này là tạo một mảng các chỉ mục có độ dài bằng với chuỗi, tất cả được khởi tạo ở mức 0. Sau đó chúng tôi xử lý mảng chỉ mục này làm bộ đếm để liệt kê tất cả các ánh xạ có thể có của chuỗi nguồn của chúng tôi. Một chỉ mục 0 ánh xạ vị trí đó trong chuỗi tới ánh xạ đầu tiên cho ký tự đó, từ 1 đến giây, vv Chúng ta có thể duyệt qua chúng theo thứ tự bằng cách tăng chỉ số cuối cùng trong mảng, chuyển sang vị trí tiếp theo khi chúng ta đạt đến số lượng ánh xạ tối đa cho vị trí đó.
Để sử dụng ví dụ của bạn, chúng tôi có các ánh xạ
'a' => 'e', 'o'
'b' => 'i'
Với chuỗi đầu vào "abba", chúng ta cần một mảng Bốn yếu tố cho chỉ số của chúng tôi:
[0,0,0,0] => "abba"
[0,0,0,1] => "abbe"
[0,0,0,2] => "abbo"
[0,0,1,0] => "abia"
[0,0,1,1] => "abie"
[0,0,1,2] => "abio"
[0,1,0,0] => "aiba"
[0,1,0,1] => "aibe"
[0,1,0,2] => "aibo"
[0,1,1,0] => "aiia"
[0,1,1,1] => "aiie"
[0,1,1,2] => "aiio"
[1,0,0,0] => "ebba"
[1,0,0,1] => "ebbe"
[1,0,0,2] => "ebbo"
[1,0,1,0] => "ebia"
[1,0,1,1] => "ebie"
[1,0,1,2] => "ebio"
[1,1,0,0] => "eiba"
[1,1,0,1] => "eibe"
[1,1,0,2] => "eibo"
[1,1,1,0] => "eiia"
[1,1,1,1] => "eiie"
[1,1,1,2] => "eiio"
[2,0,0,0] => "obba"
[2,0,0,1] => "obbe"
[2,0,0,2] => "obbo"
[2,0,1,0] => "obia"
[2,0,1,1] => "obie"
[2,0,1,2] => "obio"
[2,1,0,0] => "oiba"
[2,1,0,1] => "oibe"
[2,1,0,2] => "oibo"
[2,1,1,0] => "oiia"
[2,1,1,1] => "oiie"
[2,1,1,2] => "oiio"
Trước khi chúng ta bắt đầu tạo những chuỗi, chúng ta sẽ cần một nơi nào đó để lưu trữ chúng, trong C, có nghĩa là chúng tôi đang sẽ phải cấp phát bộ nhớ. May mắn thay, chúng ta biết độ dài của các chuỗi này và chúng ta có thể tìm ra số lượng các chuỗi chúng ta sẽ tạo ra - nó chỉ là sản phẩm của số ánh xạ cho mỗi vị trí.
Trong khi bạn có thể return them in an array, tôi thích sử dụng gọi lại để trả lại khi tôi tìm thấy chúng.
#include <string.h>
#include <stdlib.h>
int each_combination(
char const * source,
char const * mappings[256],
int (*callback)(char const *, void *),
void * thunk
) {
if (mappings == NULL || source == NULL || callback == NULL)
{
return -1;
}
else
{
size_t i;
int rv;
size_t num_mappings[256] = {0};
size_t const source_len = strlen(source);
size_t * const counter = calloc(source_len, sizeof(size_t));
char * const scratch = strdup(source);
if (scratch == NULL || counter == NULL)
{
rv = -1;
goto done;
}
/* cache the number of mappings for each char */
for (i = 0; i < 256; i++)
num_mappings[i] = 1 + (mappings[i] ? strlen(mappings[i]) : 0);
/* pass each combination to the callback */
do {
rv = callback(scratch, thunk);
if (rv != 0) goto done;
/* increment the counter */
for (i = 0; i < source_len; i++)
{
counter[i]++;
if (counter[i] == num_mappings[(unsigned char) source[i]])
{
/* carry to the next position */
counter[i] = 0;
scratch[i] = source[i];
continue;
}
/* use the next mapping for this character */
scratch[i] = mappings[(unsigned char) source[i]][counter[i]-1];
break;
}
} while(i < source_len);
done:
if (scratch) free(scratch);
if (counter) free(counter);
return rv;
}
}
#include <stdio.h>
int print_each(char const * s, void * name)
{
printf("%s:%s\n", (char const *) name, s);
return 0;
}
int main(int argc, char ** argv)
{
char const * mappings[256] = { NULL };
mappings[(unsigned char) 'a'] = "eo";
mappings[(unsigned char) 'b'] = "i";
each_combination("abba", mappings, print_each, (void *) "abba");
each_combination("baobab", mappings, print_each, (void *) "baobab");
return 0;
}
Nope không làm bài tập, giúp đỡ một nhóm với một cuộc sống thực chuyển giao với một thời hạn chặt chẽ. Tôi là một anh chàng nhúng đôi E, không quen thuộc với cấu trúc dữ liệu, vv… Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao, thậm chí là một điểm để đi theo một hướng cụ thể. Đã suy nghĩ đệ quy, nhưng nó không cảm thấy đúng. – Gio
@Gio: Ok, độ dài tối đa của ánh xạ là bao nhiêu? chúng có được cố định, tức là 2 ánh xạ có thể không? như trong ví dụ trên? – t0mm13b
Độ dài chuỗi tối đa = 32, số bản đồ tối đa = 8, số ký tự tối đa trên mỗi bản đồ = 4. Rõ ràng, không được đúc bằng đá vì có người tiếp thị liên quan ... thở dài.Vì vậy, các đầu mối thuật toán sẽ được đánh giá cao nhất. Chúng tôi có thể xử lý các vấn đề về bộ nhớ hoặc tinh chỉnh khác nếu cần. Tắt cuộc họp. – Gio