题目
思路:对于字符串找到L和R交替连接的数目
for(int i=0;i<=n;i++) {
char x='R';
int an=0;
for(int j=i-1;j>=0;j--) {//左边
if(a[j]!=x) {
an++;
x=a[j];
}else {
break;
}
}
x='L';
for(int j=i;j<n;j++) {//右边
if(a[j]!=x) {
an++;
x=a[j];
}else {
break;
}
}
ans[i]=an;
}
这样会超时,所以需要求一下前缀和预处理
for(int i=1;i<n;i++) {
if(a[i-1]!=a[i]) {
node[i].id=node[i-1].id;
node[i].s+=node[i-1].s;
}
}
for(int i=n-2;i>=0;i--)if(node[i].id==node[i+1].id)node[i].s=node[i+1].s;//获得每条路的最大联通
//System.out.println(Arrays.toString(node));
for(int i=0;i<=n;i++) {
ans[i]=1;
if(i==0) {
if(a[i]=='R')ans[i]=Math.max(ans[i], node[i].s+1);
}else if(i==n){
if(a[i-1]=='L')ans[i]=Math.max(ans[i], node[i-1].s+1);
}else {
if(a[i]=='R')ans[i]=Math.max(ans[i], node[i].s+1);
else if(a[i-1]=='L')ans[i]=Math.max(ans[i], node[i-1].s+1);
}
}
AC代码:
import java.io.*;
import java.lang.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
static Scanner scanner=new Scanner(System.in);
static char a[];
static int ans[];
static int n;
public static void main(String[] args) {
int q=scanner.nextInt();
while(q-->0) {
n=scanner.nextInt();
a=scanner.next().toCharArray();
ans=new int[n+1];
Node node[]=new Node [n];
for(int i=0;i<n;i++)node[i]=new Node(i, 1);
for(int i=1;i<n;i++) {
if(a[i-1]!=a[i]) {
node[i].id=node[i-1].id;
node[i].s+=node[i-1].s;
}
}
for(int i=n-2;i>=0;i--)if(node[i].id==node[i+1].id)node[i].s=node[i+1].s;//获得每条路的最大联通
//System.out.println(Arrays.toString(node));
for(int i=0;i<=n;i++) {
ans[i]=1;
if(i==0) {
if(a[i]=='R')ans[i]=Math.max(ans[i], node[i].s+1);
}else if(i==n){
if(a[i-1]=='L')ans[i]=Math.max(ans[i], node[i-1].s+1);
}else {
if(a[i]=='R')ans[i]=Math.max(ans[i], node[i].s+1);
else if(a[i-1]=='L')ans[i]=Math.max(ans[i], node[i-1].s+1);
}
}
StringBuilder sb=new StringBuilder();
for(int i=0;i<=n;i++)sb.append(ans[i]+" ");
System.out.println(sb);
}
}
static class Node{
int id,s;
public Node(int x, int y) {
this.id = x;
this.s = y;
}
@Override
public String toString() {
return id + " " + s ;
}
}
}