394. Decode String

题目:

解码字符串,解码规则是k[str]被解码为k个str连起来的字符串

举例如下:

s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".


思路:递归(栈)

设置一个指针,递归的规则是:返回指针指着的字符为开始的字符串,直到指针指向字符串的末尾。

被解码的字符串分为两种:

  • 单纯的字母:如a
  • 数字和固定格式的字母:3[a]
当只是单纯地字母时,返回的字符串即为:这个字母+指针向后走一步的递归结果
是数字和固定格式的字母时,返回的字符串需要先拿出连续的数字拼接成重复次数,再用递归函数得到[符号之后的字符串的结果,返回这么多遍结果的拼接,最终移动指针跳过]符号
如果是合法字符串,那么指针是不可能指向]符号的。
递归的终止条件是指针指向了字符串的末尾。


程序

public class Solution {
    int pos = 0;
    
    //recusive: return the decoded string start with the position
    public String decodeString(String s) {
    	String ans = "";
    	
    	//if the pos comes to the end, return nothing
    	if(pos == s.length()) return "";
    	
    	//if the pos points to a character, just return the character + string start with the next position 
    	else if(s.charAt(pos) >= 'a' && s.charAt(pos) <= 'z') {
    		return s.charAt(pos++) + decodeString(s);
    	}
    	
    	//if the pos points to a digit, store the continuous digits and calculate the times
    	else if(Character.isDigit(s.charAt(pos))) {
    		int times = 0;
    		//calculate the digits
    		while(Character.isDigit(s.charAt(pos))) 
    			times = times * 10 + s.charAt(pos++) - '0';
    		//skip the '['
    		pos++;
    		//find the string start with pos
    		String tmp = decodeString(s);
    		//return the times of the pos
    		for(int i = 0; i < times; i++) 
    			ans += tmp;
    		//skip the ']'
    		pos++;
    		return ans +decodeString(s);
    		
    	} else {
    		return "";
    	}
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值