import java.util.Arrays;
import java.util.StringJoiner;
public static String solution(int num, String data) {
int []arrL = new int[num];
int []arrR = new int[num];
int []arrResult = new int[num];
int l = 1;int pointl = 0;
int r = -1;int pointr = 0;
for (int i = num-1; i >= 0; i--) {
if( data.charAt(i) == 'L'){
pointl = 1;l = 1;
}else if (data.charAt(i) == 'R'){
pointl = 0;l = 1;
}
if(pointl == 1){
arrL[i] = l++;
}else arrL[i] = 0;
}
for (int i = 0; i < num; i++) {
if( data.charAt(i) == 'R'){
pointr = 1;r = -1;
}else if (data.charAt(i) == 'L'){
pointr = 0;r = -1;
}
if(pointr == 1){
arrR[i] = r--;
}else arrR[i] = 0;
}
int index =0;
var result = new StringJoiner(",", ":", "");
for (int i = 0; i < num; i++) {
arrResult[i] = arrL[i] + arrR[i];
if(arrResult[i] == 0){
index++;
result.add((i+1) + "");
}
}
System.out.println("arrL" + Arrays.toString(arrL));
System.out.println("arrR" + Arrays.toString(arrR));
System.out.println("Result" + Arrays.toString(arrResult));
System.out.println(index + result.toString());
if(index == 0)return "0";
else return index + result.toString();
}
}
思路如下:
以{.L.R...LR..L..}为例子
1.创建三个整形数组,
第一个数组arrL表示L对整个数列的影响
第二个数组arrR表示R对整个数列的影响
第三个数组表示结果
2.arrL从右向左遍历,遇到L置为1,随后以此增加,遇到R重置
即arrL[2, 1, 0, 0, 4, 3, 2, 1, 0, 3, 2, 1, 0, 0]
3.arrR从左向右遍历,遇到R置为-1,随后以此反向增加,遇到L重置
即arrR[0, 0, 0, -1, -2, -3, -4, 0, -1, -2, -3, 0, 0, 0]
4.两数组相加得到结果
Result[2, 1, 0, -1, 2, 0, -2, 1, -1, 1, -1, 1, 0, 0]
其中,
>0表示左偏
<0表示右偏
=0表示直立
5.使用StringJoiner按照题目要求拼接返回就行