【发布时间】:2017-10-03 16:52:24
【问题描述】:
问题:
给定一串数字,计算作为任何回文的字谜的子词(一致子序列)的数量。
例子:
对于输入字符串“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,我多次调试它,但仍然无法理解它为什么起作用。再读一遍问题,这是回文的字谜。
标签: c algorithm palindrome anagram