給定一串數字,計算任何迴文的字形的子字數(一致的子序列)。
實施例:
對於輸入字符串 「02002」 的結果應該是11,即:
「0」, 「2」, 「0」, 「0」, 「2」,「00 」, 「020」, 「200」, 「002」, 「2002」, 「02002」
我可以看到下面的作品是解決辦法,但我不明白爲什麼。特別是我不明白內部循環的重點。任何人都可以解釋這背後的邏輯嗎?
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define M 1000000007
#define COLORS 10
#define SUBSETS (1 << (COLORS))
int solution(char *S) {
int len, result;
int *values;
int v, idx, middle, mask;
result = 0;
values = calloc(SUBSETS, sizeof(int));
//new_values = calloc(SUBSETS, sizeof(int));
len = strlen(S);
mask = 0;
for (idx = 0; idx < len; idx++) {
v = S[idx] - '0';
mask ^= (1 << v);
values[mask^(1 << v)] += 1;
result = (result + values[mask]) % M;
for (middle = 0; middle < COLORS; middle++) {
result = (result + values[mask^(1 << middle)]) % M;
}
}
return result;
}
更多詳情如果需要:https://codility.com/programmers/task/winter_lights/。
時間來學習如何調試......順便說一句,我可以看到的唯一的迴文是'「2002」'... – LPs
@LPs,我調試它多次,但仍無法理解爲什麼它的工作原理。然後再讀這個問題,它是迴文的一個字母。 – Marko