括号算法题总结

1.去掉所有括号内的内容

 public static void main(String[] args) {
    	  String dsr = "中国(合肥(安庆)蜀山)高校(jiaoyu)基地";
          char[] dsrchar = dsr.toCharArray();
          LinkedList dsrlist = new LinkedList<String>();
          for (int i = 0; i < dsrchar.length;) {
              if (dsrchar[i] == ')') {
                  i++;
                  while ((char) dsrlist.getLast() != '(') {
                      dsrlist.removeLast();
                  }
                  dsrlist.removeLast();
              }else {
            	  dsrlist.add(dsrchar[i]);
                  i++;  
              }       
          }
          String dsrString = "";
          List<String> arrayList = new ArrayList<String>(dsrlist);
          String ssString = arrayList.toString();
          ssString = ssString.replaceAll(",", "");
          ssString = ssString.replaceAll("\\[", "");
          ssString = ssString.replaceAll("\\]", "");
          ssString = ssString.replace(" ", "");
          System.out.println(ssString);
          
    	  
    	  
   
    	}

输出结果:

中国高校基地

2.多个括号嵌套,每个括号外有个数字表示重复的个数。(每个括号前面都会有数字)
例如: 输入 abc3(A) 输出abcAAA
输入 2(2(a)2(b)) 输出aabbaabb
自己目前写的比较冗余,以后想到复杂度低的再改进,但是可以暂时一步步理解。

public class Test {
      public static void main(String[] args) {
    	  long time1 = System.currentTimeMillis();
    	  String dsr = "2{2[12(3(ab)3(ab))]}";
          char[] dsrchar = dsr.toCharArray();
          LinkedList<Character> dsrlist = new LinkedList();
          for (int i = 0; i < dsrchar.length;) {
        	     //遇到小括号
              if (dsrchar[i] == ')') {
                  i++;
                 Stack stChar = new Stack();
                 
                  while ( dsrlist.getLast() != '(') {
                      stChar.push(dsrlist.getLast());
                      dsrlist.removeLast();
                  }  
                  dsrlist.removeLast();//删掉左括号
                  String temp = "";
                  while(!stChar.isEmpty()) {
                	  temp+=stChar.pop();
                  }   
                 //得到前面的数字
                  Stack<Character> stNum = new Stack();
                  while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
                	  stNum.push(dsrlist.getLast());
                	  dsrlist.removeLast();
                  }
                int count = Transform(stNum); 
                
                 //将字符栈中的字符都出栈并加入到LinkedList里
                char [] c = temp.toCharArray();
                  for(int j =1;j<=count;j++) {
                	  for(int k = 0;k<c.length;k++) {
                		  dsrlist.add(c[k]);
                	  }
                  }
                  //遇到中括号
              }else if (dsrchar[i] == ']') {
                  i++;
                 Stack stChar = new Stack();
                 
                  while ( dsrlist.getLast() != '[') {
                      stChar.push(dsrlist.getLast());
                      dsrlist.removeLast();
                  }  
                  dsrlist.removeLast();//删掉左括号
                  String temp = "";
                  while(!stChar.isEmpty()) {
                	  temp+=stChar.pop();
                  }
                   
                 //得到前面的数字
                  Stack<Character> stNum = new Stack();
                  while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
                	  stNum.push(dsrlist.getLast());
                	  dsrlist.removeLast();
                  }
                int count = Transform(stNum); 
                
                 //将字符栈中的字符都出栈并加入到LinkedList里
                char [] c = temp.toCharArray();
                  for(int j =1;j<=count;j++) {
                	  for(int k = 0;k<c.length;k++) {
                		  dsrlist.add(c[k]);
                	  }
                  }
                   //遇到大括号
              }else if (dsrchar[i] == '}') {
                      i++;
                      Stack stChar = new Stack();
                      
                       while ( dsrlist.getLast() != '{') {
                           stChar.push(dsrlist.getLast());
                           dsrlist.removeLast();
                       }  
                       dsrlist.removeLast();//删掉左括号
                       String temp = "";
                       while(!stChar.isEmpty()) {
                     	  temp+=stChar.pop();
                       }
                        
                      //得到前面的数字
                       Stack<Character> stNum = new Stack();
                       while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
                     	  stNum.push(dsrlist.getLast());
                     	  dsrlist.removeLast();
                       }
                     int count = Transform(stNum); 
                     
                      //将字符栈中的字符都出栈并加入到LinkedList里
                     char [] c = temp.toCharArray();
                       for(int j =1;j<=count;j++) {
                     	  for(int k = 0;k<c.length;k++) {
                     		  dsrlist.add(c[k]);
                     	  }
                       } }else {
            	  dsrlist.add(dsrchar[i]);
                  i++;  
              }
               
          }
          System.out.println(dsrlist.toString());
          System.out.println(dsrlist.toString());
          StringBuilder sb = new StringBuilder();
          for(Character c:dsrlist) {
        	  sb.append(c);
          }
          System.out.println(sb.toString());
    	}
      public static int Transform(Stack<Character> stNum) {
    	  String s = "";
    	  while(!stNum.isEmpty()) {
    		  s+=stNum.pop();
    	 }
    	  return Integer.valueOf(s);
    	  
      }
       
}

给定一个只包含字符’(’,’)’,’{’,’}’,’[‘和’]'的字符串,确定输入字符串是否有效。

如果输入字符串有效:

必须使用相同类型的括号关闭左括号。
必须以正确的顺序关闭打开括号。

Example 1:

Input: "()"
Output: true
Example 2:

Input: "()[]{}"
Output: true
Example 3:

Input: "(]"
Output: false
Example 4:

Input: "([)]"
Output: false
Example 5:

Input: "{[]}"
Output: true
public boolean isValid(String s) {
	   Stack<Character> st = new Stack();
	   for(int i = 0;i<s.length();i++) {
		   if(s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
			   st.push(s.charAt(i));
		   }else {
			   if(st.empty()) return false;
			   char c = st.pop();
			   if(s.charAt(i) == ')') {
				   if(c!='(') return false;
				   continue;
			   }
			   if(s.charAt(i) == ']') {
				   if(c!='[') return false;
				   continue;
			   }
			   if(s.charAt(i) == '}') {
				   if(c!='{') return false;
				   continue;
			   }
		   }
	   }
	   if(st.empty()) return true;
	   return false;
   }

4.给定n对括号,编写一个函数来生成格式正确的括号的所有组合。

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
public List<String> generateParenthesis(int n){
	   List<String> list = new  ArrayList();
	   if(n<=0) return list;
	   parentheses("",list,n,n);
	   return list;
   }
   public void parentheses(String str,List<String> list,int left,int right) {
	   if(left>right) return ;
	   if(left>0) parentheses(str+"(",list,left-1,right);
	   if(right>0) parentheses(str+")",list,left,right-1);
	   if(left == 0 && right == 0) {
		   list.add(str);
		   return ;
	   }
   }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值