区间求并:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int[][] v = new int[26][2];//存储各字母左右极限下标
        boolean[][] visit= new boolean[26][2];//标记该字母有没有被访问过
        boolean[] r = new boolean[s.length()];//标记某区间有没有被跨过
        for(int i = 0; i < s.length(); ++i){
            int j = s.charAt(i) - 'a';
            int k = s.charAt(s.length() - 1 - i) - 'a';
            if(visit[j][0] == false){
                v[j][0] = i;
                visit[j][0] = true;
            }
            if(visit[k][1] == false){
                v[k][1] = s.length() - 1 - i;
                visit[k][1] = true;
            }
        }
        List<List<Integer>> vec = new ArrayList<>();//只保存有用的区间(可以略过)
        for(int i = 0; i < 26; ++i){
            if(visit[i][0] && visit[i][1]){
                List<Integer> temp = new ArrayList<>();
                temp.add(v[i][0]);
                temp.add(v[i][1]);
                vec.add(temp);
            }
        }
        for(int i = 0; i < vec.size(); ++i){//将那些被有用区间跨过的区间置为true
            int p = vec.get(i).get(0);
            int q = vec.get(i).get(1);
            for(int j = p; j < q; ++j) r[j] = true;
        }
        int sum = 1;
        int flag = 1;//打印第一个答案,前面不需要空格
        for(int i = 0; i < r.length; ++i){
            if(r[i] == true) sum++;
            else{//每一个未被跨过的区间,就标志着新一段并区间的开始
                if(flag == 0) System.out.print(" ");
                else flag = 0;
                System.out.print(sum);
                sum = 1;
            }
        }
    }
}