不准访问
- 积分
- 180
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-5-11
- 最后登录
- 1970-1-1
|
承认, 这道题是有点不好想。。
我写了蛮久的还
先说简单的stack想法吧, 我是用一个stack装前面的string, 另一个stack装'['前面的数字。 这样每遇到一个']'的时候就可以反算新的字符串了。代码如下
- public String decodeString(String s) {
- Stack<String> str = new Stack<>();
- Stack<Integer> count = new Stack<>();
- int val = 0;
- String curStr = "";
- for(char c : s.toCharArray())
- {
- if('0' <= c && c <= '9')
- val = val * 10 + c - '0';
- else if(c == '[') // treat as new string, reset counter and current string
- {
- str.push(curStr);
- curStr = "";
- count.push(val);
- val = 0;
- }
- else if(c == ']')
- {
- int append = count.pop();
- String appendStr = str.pop();
- while(append-->0)
- appendStr += curStr;
- curStr = appendStr; // 我这一块一直搞错, 一直觉得应该进栈, 最后返回是stack.pop(). 后来发现这样不对, 因为current string就没办法更新了。 有点试错的感觉, 这段逻辑写的不好
- }
- else curStr += c; // [a-zA-Z]
- }
- return curStr;
- }
复制代码
当然了, 你需要recursion的写法。 上面就是用stack 写出来而已 ,所以用递归的方法也完全没有问题。
- public String decodeString( String s )
- {
- return decode( s, "", 0 );
- }
- String decode( String s, String apd, int v )
- {
- if ( s.length() < 1 ) return apd;
- if ( s.charAt( 0 ) == '[' )
- {
- // take care of ']' case
- int i = 1, k = 1; // for [] balance
- while ( k > 0 )
- {
- if ( s.charAt( i ) == '[' ) k++;
- if ( s.charAt( i ) == ']' ) k--;
- i++;
- }
- // i will be position after ']', thus -= 1
- i -= 1;
- String dcd = decode( s.substring( 1, i ), "", 0 );
- while ( v-- > 0 ) apd += dcd;
- return decode( s.substring( i + 1 ), apd, 0 );
- }
- else if ( '0' <= s.charAt( 0 ) && s.charAt( 0 ) <= '9' )
- {
- return decode( s.substring( 1 ), apd, v * 10 + s.charAt( 0 ) - '0' );
- }
- return decode( s.substring( 1 ), apd + s.charAt( 0 ), v );
- }
复制代码 |
|