给定一串数字,计算任何回文的字形的子字数(一致的子序列)。
实施例:
对于输入字符串 “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