• 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);
    	}
    };
    

    视频题解空间

  • 相关阅读:
    【C#】枚举和字符串以及数字之间的互相转换
    MySQL中int(M)和tinyint(M)数值类型中M值的意义
    C# 将数组拼接为字符串 string.Join 的使用
    MySQL-locate()函数
    C# 4.0 dynamic用法,并且与 var, object的区别
    Go语言 go get 找不到 google.golang.org/protobuf/encoding/prototext 解决办法
    Go语言 中逗号ok模式
    MySQL数据库面试题(2020最新版)
    .Net Core 3.0开源可视化设计CMS内容管理系统建站系统
    SQL Server 全文搜索/全文索引
  • 原文地址:https://www.cnblogs.com/itdef/p/16210842.html
Copyright © 2020-2023  润新知