問題:コーディングの課題 - このソリューションはなぜ機能するのですか?
与えられた数字の文字列では、任意の回文のアナグラムであるサブワード(一貫したサブシーケンス)の数を数えます。
例:入力文字列について
"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