陨石的秘密
n由{},[],()三种括号对构成的字串,括号必须配对,可以嵌套,但不得交叉。
并且 () 内不能出现 {} 和 [],[] 内不能出现 {}。
n定义其深度为最大嵌套层数。
n()(())[] 深度为2
n{()[()]} 深度为3
n{{[[(())]]}} 深度为6
n()([]){} 不合法
n{([())]} 不合法
package com.w1m.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Stack; public class RockCode { private String strCode; private Stack<Object> stk; public RockCode() { this.strCode=""; stk=new Stack<Object>(); } public ReturnType processCodeSeg(String strParaCodeSeg) { ReturnType rt=new ReturnType(); int itDegree=0; int itType; int j; if(strParaCodeSeg.equals("")) { rt.setItType(0); rt.setItDegree(0); rt.setBlNormal(true); return rt; } for(j=0;j<strParaCodeSeg.length();j++) { if(strParaCodeSeg.substring(j, j+1).equals("{")) { if(this.stk.isEmpty()) { this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } else if(((String)this.stk.peek()).equals("[") || ((String)this.stk.peek()).equals("(")) { return rt; } else { //return -1; // return rt; this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } } else if(strParaCodeSeg.substring(j, j+1).equals("[")) { if(this.stk.isEmpty()) { this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } else if(((String)this.stk.peek()).equals("(")) return rt; else { this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } } else if(strParaCodeSeg.substring(j, j+1).equals("(")) { if(this.stk.isEmpty()) { this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } // else if(!((String)this.stk.peek()).equals("(")) // return rt; else { this.stk.push(strParaCodeSeg.substring(j, j+1)); // itDegree++; rt.setItDegree(++itDegree); } } // else // return rt; else if(strParaCodeSeg.substring(j, j+1).equals("}")) { if(!((String)this.stk.peek()).equals("{")) return rt; else { this.stk.pop(); if((--itDegree)==0) break; } } else if(strParaCodeSeg.substring(j, j+1).equals("]")) { if(!((String)this.stk.peek()).equals("[")) return rt; else { this.stk.pop(); if((--itDegree)==0) break; } } else if(strParaCodeSeg.substring(j, j+1).equals(")")) { if(!((String)this.stk.peek()).equals("(")) return rt; else { this.stk.pop(); if((--itDegree)==0) break; } } else return rt; } // return itDegree; if(j<strParaCodeSeg.length()-1) { rt.setItType(1); rt.setItPos(j); rt.setBlNormal(true); return rt; } else { rt.setItType(0); rt.setItPos(j); rt.setBlNormal(true); return rt; } } public int decodeRockCode(String strParaCodeString) { ReturnType rt=this.processCodeSeg(strParaCodeString); if(rt.blNormal) { if(rt.getItType()==0) return rt.getItDegree(); else return maxCodeSegDegree(decodeRockCode(strParaCodeString.substring(0, rt.getItPos())),decodeRockCode(strParaCodeString.substring(rt.getItPos()+1))); } else { return 10000; } // return 0; } private int maxCodeSegDegree(int itPara1, int itPara2) { // TODO Auto-generated method stub if(itPara1>itPara2) return itPara1; else return itPara2; } public String getStrCode() { return strCode; } public void setStrCode(String strCode) { this.strCode = strCode; } public class ReturnType { private boolean blNormal; //陨石密码是否正确 private int itDegree; //陨石密码的深度 private int itType; //陨石密码的类型 0:非嵌套 1:嵌套 private int itPos; //陨石秘密处理字符位置 public ReturnType() { this.blNormal=false; } public int getItPos() { return itPos; } public void setItPos(int itPos) { this.itPos = itPos; } public boolean isBlNormal() { return blNormal; } public void setBlNormal(boolean blNormal) { this.blNormal = blNormal; } public int getItDegree() { return itDegree; } public void setItDegree(int itDegree) { this.itDegree = itDegree; } public int getItType() { return itType; } public void setItType(int itType) { this.itType = itType; } } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub System.out.println("input Rock Code string below:"); BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); // int itInput,itCount=0; String strInput=br.readLine(); // System.out.println("input 1st int number below:"); RockCode rc=new RockCode(); // ReturnType rtp=rc.processCodeSeg("{[()]}[]"); // System.out.println("Normal:"+rtp.isBlNormal()+" Type:"+rtp.getItType()+" Degree:"+rtp.getItDegree()+" Pos:"+rtp.getItPos()); // System.out.println(rc.decodeRockCode("{[()]}[[[(]]]")); if((rc.decodeRockCode(strInput))==10000) { System.out.println("Error Rock Code string"); } else { System.out.println(rc.decodeRockCode(strInput)); } } }