Leetcode 394) Decode String

image-20210512184004980

  • 사용해야할 것 같은 함수 : 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();
    }
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2