首页 文章 精选 留言 我的

精选列表

搜索[decode],共2067篇文章
优秀的个人博客,低调大师

LeetCode 394:字符串解码 Decode String

题目: 给定一个经过编码的字符串,返回它解码后的字符串。Given an encoded string, return its decoded string. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer. 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc. 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4]. 示例: s = "3[a]2[bc]", 返回 "aaabcbc". s = "3[a2[c]]", 返回 "accaccacc". s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef". 解题思路: ​ 这道题类似我们之前做过的一道题:有效的括号: https://mp.weixin.qq.com/s/Sm1S26EgR-dC75hrhVnZGQ 只不过''有效的括号'' [] 内多了一些字符串需要操作。我们同样可以用数据结构栈来解题,,能用栈解决的题目大部分都可以用递归解决,两者逻辑基本相同: 输入:'3[a2[c]]' 初始化栈: 栈nums 存要重复的次数k,栈str 存字符串 遍历字符串: 指针指向字符'3',为数字 num暂存数字3 继续遍历,遇到字符'[' 循环次数num入栈nums,空字符串res入栈str nums: 3 res: '' num置为0,str置空 继续遍历,遇到字符'a',为字母 空字符串res拼接字母'a',res='a' 继续遍历,遇到字符'2',为数字 num暂存数字2 继续遍历遇到字符'[' num入栈nums,res入栈str nums: 3 -> 2 str: '' -> 'a' num置为0,str置空 继续遍历,遇到字符'c',为字母 空字符串res拼接字母'c',res='c' 继续遍历遇到字符']' nums弹出栈顶元素:当前字符串重复次数2 res = res*2 = 'cc' str弹出栈顶元素'a'与res拼接并入栈: res = 'a'+'cc'='acc' str: '' -> 'acc' 继续遍历遇到字符']' nums弹出栈顶元素:当前字符串重复次数3 res = res*3 = 'accaccacc' str弹出栈顶元素空字符串''与res拼接并入栈: res=''+'accaccacc'='accaccacc' str: 'accaccacc' 结束返回res 注意: 由于重复次数可能大于10,所以暂存数字时要适当处理,如 num*10+当前数字 在c++里可以直接修改拼接字符,但Java不支持运算符重载,可以借助 StringBuilder 或 StringBuffer 类。 用栈暂存的逻辑与递归基本一致,可以理解为用递归实现栈。 python没有栈这种数据结构,可以用 list() 数组或双端队列 deque() python可以只用一个栈以元组的形式重复次数和字符串,如(num,res) 利用栈: Java: class Solution { public String decodeString(String s) { //初始化数据结构 Stack<StringBuilder> str = new Stack<>(); Stack<Integer> nums = new Stack<>(); StringBuilder res = new StringBuilder(); int num = 0; for (char c : s.toCharArray()) {//递归字符串 if (c == '[') { str.push(res);//入栈 nums.push(num); num = 0;//刷新num、res res = new StringBuilder(); } else if (c == ']') { StringBuilder tmp = new StringBuilder(); for (int i = nums.pop(); i > 0; i--) tmp.append(res);//res*3 res = str.pop().append(tmp); } else if (c >= '0' && c <= '9') num = num * 10 + (c - '0');//计算重复次数 else res.append(c); } return res.toString(); } } Python: 可直接操作字符串真的很方便。py里有现成的判断字符串的方法: isdigit() 是否为只包含数字的字符串 isalpha() 是否为只包含字母的字符串 class Solution: def decodeString(self, s: str) -> str: #初始化数据结构 stack, res, num = [], '', 0 for c in s: if c.isdigit(): num = num * 10 + int(c) elif c.isalpha(): res += c elif c == '[': #元组形式入栈 stack.append((res, num)) #刷新字符串和重复次数 res, num = '', 0 else: #如果c==']',弹出字符串和重复次数 last_str, this_num = stack.pop() res = last_str + this_num * res return res 利用递归: Java: 将 s.length() 的值以参数传递,减少重复调用 length() 造成的时间损耗 class Solution { private int i = -1;//全局变量i,记录字符数组指针位置 public String decodeString(String s) { return dfs(s.toCharArray(), s.length()).toString(); } //递归函数 private StringBuilder dfs(char[] chars, int len) { int num = 0; StringBuilder str = new StringBuilder(); while (++i < len) { if (chars[i] >= '0' && chars[i] <= '9') num = num * 10 + (chars[i] - '0'); else if (chars[i] == '[') { StringBuilder tmp = dfs(chars, len);//递归调用 while (--num >= 0) str.append(tmp);//重复字符串res=res*num num = 0; } else if (chars[i] == ']') return str; else str.append(chars[i]); } return str; } } Python: class Solution: i = -1 #递归函数,可以直接操作字符串就无需再建一个dfs辅助函数 def decodeString(self, s: str) -> str: res, num = '', 0 while self.i < len(s) - 1: self.i += 1 if s[self.i].isdigit(): num = num * 10 + int(s[self.i]) elif s[self.i].isalpha(): res += s[self.i] elif s[self.i] == '[': #递归调用 res += self.decodeString(s) * num num = 0 elif s[self.i] == ']': return res return res 欢迎关注微.信公.众号:爱写Bug

优秀的个人博客,低调大师

javascript中escape()、unescape()、encodeURI()、encodeURIComponent()、decode...

这些URI方法encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()代替了BOM的escape()和unescape()方法。URI方法更可取,因为他们对所有Unicode编号编码,而BOM方法只能对ASCII编号正确编码。尽量避免使用escape()和unescape()方法。 js对文字进行编码设计三个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1、传递参数时,需要使用encodeURIComponent,这样组合的url才不会被#等特殊字段截断。 例如: 2、进行url跳转时可以整体使用encodeURI 例如:location.href = encodeURI(http://cang.baidu.com/do/s?word=百度&ct=21); 3、js使用数据时可以使用escape 例如:搜藏中history纪录 4、escape对0-255以外的unicode值进行编码输出%u****格式,其他情况下escape,encodeURI,encodeURIComponent编码结果相同。 最多使用的应为encodeURIComponent,他是将中文、韩文等特殊字符装换成UTF-8格式的urll编码,所以结果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同) escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z unescape 方法 从用 escape 方法编码的 String 对象中返回已解码的字符串。 function unescape(charString : String) : String 参数 charString 必选。要解码的 String 对象或文本。 备注 unescape 方法返回一个包含 charstring 内容的字符串值。所有以 %xx 十六进制形式编码的字符都用 ASCII 字符集当中等效的字符代替。以 %uxxxx 格式(Unicode 字符)编码的字符用十六进制编码 xxxx 的 Unicode 字符代替。注意 unescape 方法不应用于解码“统一资源标识符”(URI)。请改用 decodeURI 和 decodeURIComponent 方法。 decodeURI 方法 返回一个已编码的统一资源标识符 (URI) 的非编码形式。 function decodeURI(URIstring : String) : String 参数 URIstring 必选。表示编码 URI 的字符串。 备注 使用 decodeURI 方法代替已经过时的 unescape 方法。 decodeURI 方法返回一个字符串值。 如果 URIString 无效,将发生 URIError。 decodeURIComponent 方法 返回统一资源标识符 (URI) 的一个已编码组件的非编码形式。 function decodeURIComponent(encodedURIString : String) : String 必选的 encodedURIString 参数是一个表示已编码的 URI 组件的值。 备注 URIComponent 是一个完整的 URI 的一部分

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册