標準4889、安定した文字列-文字列、stack
10361 ワード
https://www.acmicpc.net/problem/4889
1.アイデア
{
プッシュStack
2)括弧}
Stack
非空(左かっこ付き)=>
Stack
左かっこ+右かっこに一致するようにポップアップStack
が空=>
Stack
の右かっこ}
を左かっこ{
pushに置き換え、演算回数+1Stack
偶数個のみ左かっこ{
=>大かっこ{
:入力文字列の元の大かっこ{
or文字列の括弧}
を入力し、Stack
に変換するとStack
のsize/2)=>
Stack
の残りの左かっこ.いずれかをカッコの半分だけを閉じるように置き換えると、残りのカッコはすべて完了
カッコの問題はいつもStackを思い出させる
2.資料構造
String
:入力文字列Stack<Character>
:かっこ対マッチング3.時間複雑度
=>文字列あたり最大2000
コード#コード#
import java.io.*;
import java.util.Stack;
public class Main {
static String str; // 입력 문자열
static Stack<Character> stack;
static int solution(String str) {
stack = new Stack<>();
int minCount = 0; // 최소 연산 횟수
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '{')
stack.push(str.charAt(i));
else { // 닫는 괄호 '}'
if (!stack.isEmpty())
stack.pop(); // 매칭되는 여는 괄호 { 제거
else {
// 닫는 괄호 } 를 여는 괄호 { 로 변환하여 추가
stack.push('{');
minCount++;
}
}
}
minCount += (stack.size() / 2);
return minCount;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
StringBuilder sb = new StringBuilder();
int i = 1;
while (true) {
str = br.readLine();
if (str.contains("-"))
break;
sb.append(i).append(". ")
.append(solution(str)).append("\n");
i++;
}
System.out.println(sb.toString());
}
}
Reference
この問題について(標準4889、安定した文字列-文字列、stack), 我々は、より多くの情報をここで見つけました https://velog.io/@silver_star/백준-4889-안정적인-문자열-문자열テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol