给定一个由小写字母组成的字符串s,请将其分割成尽量多的子串,并保证每个字母最多只在其中一个子串中出现。请返回由一个或多个整数表示的分割后各子串的长度。
给定一个由小写字母组成的字符串s,请将其分割成尽量多的子串,并保证每个字母最多只在其中一个子串中出现。请返回由一个或多个整数表示的分割后各子串的长度。
来自标准输入的一行由小写字母组成的字符串。
字符串最优分割后各子串的长度,多个数字之间由空格分隔。
ababbacadefgdehijhklij
8 6 8
该样例下最优的分割为"ababbaca" + "defgde" + "hijhklij",在该分割下字母abc仅出现在"ababbaca"中、字母defg仅出现在"defgde"中、字母hijkl仅出现在"hijhklij"中
要求将其“分割为尽量多的子串”意味着像"ababbacadefgde" + "hijhklij"这样的分割也是合法的,但在本题中并不是最优解
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(const int argc, const char* argv[]) {
char input[1024] = "";
gets(input);
int last_index[26]; // 每个字符最后出现的位置
int i, len = strlen(input);
for (i = 0; i < len; ++i)
last_index[input[i] - 97] = i;
int start = 0, end = 0;
for (i = 0; i < len; ++i) {
end = fmax(end, last_index[input[i] - 97]);
if (i == end) {
fprintf(stdout, "%d", end - start + 1);
if (i < len - 1) fputc(32, stdout);
start = end + 1;
}
}
return 0;
}