問(wèn)題描述###
一組括號(hào) (((( ) ( ) ( ) ) ) )
有兩種描述方法:
P方法:4 5 6 6 6 6 - 每一個(gè))前,有幾個(gè)(
W方法:1 1 1 4 5 6 - 每一個(gè)),向前數(shù)幾個(gè)是跟它匹配的(
要求是根據(jù)P求W
參考:http://www.cnblogs.com/linucos/archive/2011/10/12/2208567.html
難點(diǎn)###
將原序列轉(zhuǎn)化為W
P轉(zhuǎn)化為原序列是很好想到的,但是后一個(gè)需要用stack的思路來(lái)解決~
百度后解決,我果然很2~
解題思路###
首先把P轉(zhuǎn)化為原始的序列,然后把原始序列轉(zhuǎn)化為W。
其中用BitSet來(lái)描述序列
- 0: "("
- 1: ")"
因?yàn)閿?shù)字描述的是')',所以我們先把數(shù)組初始化成都是'('.對(duì)于第N個(gè)數(shù)p,如第一個(gè)數(shù)4,4表示這個(gè)')'前邊的'('個(gè)數(shù),如果再知道前邊')'的個(gè)數(shù),那么這個(gè)')'的下標(biāo)就找到了. N就是前邊')'的個(gè)數(shù),所以stack[N+p]=')'.
怎么利用stack推倒出W呢?也很簡(jiǎn)單,遍歷stack數(shù)組,當(dāng)我們發(fā)現(xiàn)')'時(shí)候,就向前找,另w = 1,c = 0,遇到一個(gè)')'加1,同時(shí)c加1,說(shuō)明中間遇到一對(duì)(),遇到一個(gè)'('減1,當(dāng)w為0時(shí)候,就找到了匹配的'('. c就是個(gè)數(shù).
代碼實(shí)現(xiàn)###
`
package poj;
import java.util.BitSet;
import java.util.Scanner;
public class Poj1068 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nS = sc.nextLine();
int n = Integer.valueOf(nS);
for(int i = 0 ; i < n ; i ++){
/* translate P to real value */
sc.nextLine();
BitSet value = new BitSet();
String dataS = sc.nextLine();
String[] dataSs = dataS.split(" ");
int oldP = 0;
int newP = 0;
int len = 0;
for(String data : dataSs){
newP = Integer.valueOf(data);
int addP = newP - oldP;
for(int j = len ; j < len + addP ; j ++){
value.set(j, false);
}
len += addP;
value.set(len, true);
len ++;
oldP = newP;
}
// for(int j = 0 ; j < value.length() ; j ++){
// if(value.get(j))
// System.out.print(")");
// else
// System.out.print("(");
// }
// System.out.println();
/* translate real value to W */
// System.out.println(value);
StringBuffer sb = new StringBuffer();
for(int j = 0 ; j < value.length() ; j ++){
if(value.get(j)){
int c = 0;
int w = 1;
for(int k = j - 1 ; k >= 0 ; k --){
if(value.get(k)){
w ++;
c ++;
}
else{
w --;
}
if(w == 0)
break;
}
sb.append((c+1)+" ");
}
}
String r = sb.toString();
System.out.println(r.substring(0, r.length()-1));
// System.out.println();
}
sc.close();
}
}
`