首页 > 试题广场 >

字符串分割

[编程题]字符串分割
  • 热度指数:1910 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个由小写字母组成的字符串s,请将其分割成尽量多的子串,并保证每个字母最多只在其中一个子串中出现。请返回由一个或多个整数表示的分割后各子串的长度。


输入描述:
来自标准输入的一行由小写字母组成的字符串。


输出描述:
字符串最优分割后各子串的长度,多个数字之间由空格分隔。
示例1

输入

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;
}

发表于 2021-07-19 14:38:34 回复(0)