首页 > 试题广场 >

字符串分割

[编程题]字符串分割
  • 热度指数:1989 时间限制: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"这样的分割也是合法的,但在本题中并不是最优解
头像 牛客题解官
发表于 2020-06-05 18:35:16
题解: 考察点: 区间合并,双指针 方法一:暴力 一般来说,暴力都是解决问题最直观,也是最容易被同学们想到的方法。题中明确说明每个字母只能在一个子串中出现,因此必须保证子串内的每个字母在字符串中第一次出现的位置到最后一次出现的位置都位于区间中。设置两个指针和,表示区间的开始位置和结束位置。当访问到字 展开全文
头像 白伟仝
发表于 2020-05-10 15:59:33
区间求并: import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String 展开全文
头像 牛牛新_
发表于 2024-09-14 14:52:35
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Strin 展开全文
头像 牛客409434554号
发表于 2022-01-11 04:03:21
原理比较简单,每一个字母的所有兄弟(一样的字母)都得在一起,那么我们先找到第一个字母,即s[0]的最后一个兄弟,比如下标为m,那么显然从0到他这最后一个兄弟m之间的字母必然也都在同一个串里了,那么中间这些字母就说了,你和兄弟在一起了,我们也要和兄弟在一起。所以再用一个循环遍历中间这部分字母,找到他们 展开全文