Leetcode 394. 字符串解码

地址 https://leetcode-cn.com/problems/decode-string/

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
 

提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 '[]' 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300] 

解答

整个字符串解码可以分为三种情况:
1 开头为数字的,解析出数字,然后后面跟随的是由[]包含的另一端需要解码的字符串。递归调用解码函数,但是字符串肯定是缩短了(这样才可能逐步减少为长度0,作为递归退出的时机)。
2 以[开头的 ,使用[]包含的一串需要解码的字符串
3 纯字母开头的一串直接加入答案得到字母字符串。

class Solution {
public:
	int findNextspChar(const string& s, int l) {
		int leftCnt = 0;
		while (l <= s.size()) {
			if (s[l] == '[') { leftCnt++; }
			if (s[l] == ']') { leftCnt--; }
			if (leftCnt == 0) break;
			l++;
		}

		return l;
	}

	int fineNextNoNum(const string& s, int l) {
		while (l < s.size()) {
			if (s[l] < '0' || s[l] > '9') { break; }
			l++;
		}
		return l;
	}

	int findNextNoChar(const string& s, int l) {
		while (l < s.size()) {
			if (s[l] < 'a' || s[l] > 'z') { break; }
			l++;
		}
		return l;

	}


	string decodeStringInner(const string& s, int l, int r) {
		if (l > r) return "";  string ret;
		int repeat = 0;
		while (l <= r) {
			if (s[l] == '[') {
				int rr = findNextspChar(s, l);
				string tmp = decodeStringInner(s, l + 1, rr - 1);
				for (int i = 0; i < repeat; i++) {
					ret += tmp;
				}
				repeat = 0;   l = rr + 1;
			}
			else if (s[l] >= '0' && s[l] <= '9') {
				int rr = fineNextNoNum(s, l);
				repeat = atoi(s.substr(l, r - l).c_str());
				l = rr;
			}
			else if (s[l] >= 'a' && s[l] <= 'z') {
				int rr = findNextNoChar(s, l);
				ret += s.substr(l, rr - l);
				l = rr;
			}
		}

		return ret;
	}

	string decodeString(string s) {
		int l = 0; int r = s.size()-1;
		return decodeStringInner(s, l, r);
	}
};

视频题解空间

posted on 2022-04-30 17:59  itdef  阅读(68)  评论(0编辑  收藏  举报

导航