Leetcode 394) Decode String
in Algorithms
- 사용해야할 것 같은 함수 : stringbuilder, substring
- …. 앞으로 스택 사용하기
import java.util.*;
class Solution {
public String decodeString(String s) {
boolean st=false;
int mine = 0;
int now =-1;
StringBuilder sb = new StringBuilder();
StringBuilder rsb = new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='[' && st==false){
if(now>=0 &&9>=now){
sb.append(s.substring(0,i-1));
}else if(now >=10 && now<=99){
sb.append(s.substring(0,i-2));
}else if(now >=100 && now<=300){
sb.append(s.substring(0,i-3));
}
st=true;
}else if(st){
if(s.charAt(i)==']' && mine==0){
String rep= rsb.toString();
for(int a=0;a<now;a++){
sb.append(rep);
}
sb.append(s.substring(i+1,s.length()));
return decodeString(sb.toString());
}else if (s.charAt(i)=='['){
mine++;
}else if(s.charAt(i)==']'){
mine--;
}
rsb.append(s.charAt(i));
}else{
now =s.charAt(i)-'0';
if(now>=0 && now<=9 && st==false){
if(i+1<s.length()){
int now2 =s.charAt(i+1)-'0';
if(now2>=0 && now2<=9){
now=now*10+now2;
i++;
if(i+1<s.length()){
int now3 =s.charAt(i+1)-'0';
if(now3>=0 && now3<=9){
now=now*10+now3;
i++;
}
}
}
}
}
}
}
return s;
}
}
Different Solution
내 코드랑 비교
- Character.isDigit() 은 캐릭터가 숫자인지 알려준다. now>=0 && now<=9 이럴 필요 없음..
- 문자 - ‘0’ 을 하거나 (int)문자 - 48 을하면 숫자가 된다. ascci
- while문으로 숫자 간편하게 저장! 나도 위에서 for문보다 while문 사용했으면 더 깔끔하게 숫자 저장 가능했을거같다.
- 여기서 부터는 안 쪽 [] 부터 처리. 내 코드는 바깥쪽 []부터 처리.
- 템플릿인 input 스트링으로 for문을 돌리고, string builder에 새로 만든다.
논리
- 숫자니?
- numstack에 숫자 저장.
- 아니면 [니?
- sb에 저장된 문자를 str스택에 저장한다. 그리고 sb 초기화시킨다.
- 아니면 ]니?
- numstack pop,
- 아무것도 아니니?
- sb에 저장한다.
class Solution {
public String decodeString(String s) {
Stack<Integer> numStack = new Stack<>();
Stack<String> strStack = new Stack<>();
StringBuilder sb = new StringBuilder();
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
int num = c - '0';
while (i + 1 < n && Character.isDigit(s.charAt(i + 1))) {
num = num * 10 + s.charAt(i + 1) - '0';
i++;
}
numStack.push(num);
} else if ( c == '[') {
//처음부터 전체이던 스트링을 스택에 넣어주고 구간으로 바꿈!!
strStack.push(sb.toString());
sb = new StringBuilder();
} else if (c == ']') {
//현재 괄호 전의 거 바로 add
StringBuilder temp = new StringBuilder(strStack.pop());
int repeatedTime = numStack.pop();
//현재 괄호 내 문자들 반복
for (int j = 0; j < repeatedTime; j++) {
temp.append(sb);
}
//구간이던걸 처음부터 전체로 바꿔줌
sb = temp;
} else {
sb.append(c);
}
}
return sb.toString();
}
}