P-sequence 4 5 6666,表示第i个右括号的左边有几个左括号。
W-sequence 1 1 1456,表示第i个右括号和以它为起点的序列中的第几个左括号配对。
问题:已知P序列求W序列。
解决:用字符串数组存放括号序列,再通过遍历和多个标号的出W序列。先找到第一个右括号,在遍历它的左边的括号序列,如果为左括号,则原来为1的标号indexz自减,用于计数的sum自加。如果为右括号则index自加。并每次都判断sum的值,如果为0,则W[0]序列的值为temp,并跳出循环。按照上述过程,依次找到以后的右括号,再执行上面的算法。
import java.util.Scanner; /*把一个括号序列,从p表示形式转换成另一种表现形式w。*/ public class N1068 { int times; int len; int[] p; int[] w; String[] s; int index; int temp; int pos; public N1068(){ Scanner cin=new Scanner(System.in); times=cin.nextInt(); for(int i=0;i<times;i++){ len=cin.nextInt(); p=new int[len]; w=new int[len]; s=new String[2*len]; for(int j=0;j<len;j++){ p[j]=cin.nextInt(); } pos=0; temp=0; index=0; for(int k=0;k<len;k++){ for(;pos<p[k];pos++){ s[index++]="("; } s[index++]=")"; } transform(); for(int m=0;m<len;m++){ System.out.print(w[m]+" "); } System.out.println(); } } public void transform(){ pos=0; int k=0; for(int i=0;i<len;i++){ for(;k<2*len;k++){ if(s[k].equals(")")){ pos=k; k++; break; } } index=1; temp=0; for(int j=pos-1;;j--){ if(s[j].equals("(")){ index--; temp++; }else{ index++; } if(index==0){ w[i]=temp; break; } } } } public static void main(String[] args){ new N1068(); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。