区间求并:
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; } } } }