基本アルゴリズム-鉄棒

1464 ワード

これはレーザーで棒を切る問題です.
()が現れると、無条件にレーザ光を表す.
直観的に考えてみれば、「(」は3つだと3本の鉄棒が重なっています.そして()が入力されると、前に積み上げた「(」の数でカットされます.
ex) ()(((()())(())()))(())
  • ここ(3本の鉄棒が重なる):
  • ()はすぐに出てきて、鉄棒の個数に+3を加えて、結果=6個になりました.
  • の後、すなわち()レーザが現れ、結果=9個であった.
  • 」で閉鎖され、鉄棒の個数は2本.
  • "(")、さらに鉄棒を1本加えて3本に増やします.
  • レーザは透過し,+3は結果=12であった.ここでは例外があり、新しく鉄棒が現れたら2つに分けて+1が必要です.
  • 上に交換するものがあります.初期欄の個数を増やし、最後に加算します.
    Qでこの問題を解いてみましたが、2つのブロックが分かれている場合ではなく、スタックで解いてみました.実現から見ると、私はどうしてこれを解くことができなかったのかと思います.あまり難しく考えないで、直感的に答えなさい.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Stack;
    
    
    public class Hello_world {
     
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String str = br.readLine();
    		
    		StringBuilder sb = new StringBuilder();
    		Stack<Character> stack = new Stack<>();
    		
    		int result =0;
    		
    		for(int i=0; i<str.length(); i++) {
    			if(str.charAt(i) == '(') {
    				stack.add('(');
    			}
    			if(str.charAt(i) == ')') {
    				stack.pop();
    				
    				if(str.charAt(i-1) == '(') {
    					result += stack.size();
    				} else {
    					result++;
    				}
    			}
    		}
    		
    		System.out.print(result);
    		
    		}
    }