区间求并:
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;
}
}
}
}
京公网安备 11010502036488号