当前位置: 首页 > 后端技术 > Python

LeetCode394-StringDecodingDecodeString_0

时间:2023-03-26 14:16:46 Python

题目:给定一个编码字符串,返回它的解码字符串。给定一个编码字符串,返回它的解码字符串。编码规则为:k[encoded_string],表示方括号内的encoded_string恰好重复k次。请注意,k保证为正整数。编码规则为:k[encoded_string],其中方括号内的encoded_string正好重复k次。请注意,k保证为正整数。你可以认为输入的字符串总是有效的;没有多余的空格,输入的方括号总是格式化的。您可能会假设输入字符串始终有效;没有多余的空格,方括号格式正确等。另外,你可以认为原始数据不包含数字,所有数字只代表重复次数k,例如不会有像3a或这样的Inputs2[4]。此外,您可以假设原始数据不包含任何数字,并且数字仅用于那些重复数字k。例如,不会有像3a或2[4]这样的输入。示例:s=“3[a]2[bc]”,返回“aaabcbc”.s=“3[a2[c]]”,返回“accaccacc”.s=“2[abc]3[cd]ef”,返回“abcabccdcdcdef”。解题思路:本题类似于我们之前做过的一道题:validbrackets:https://mp.weixin.qq.com/s/Sm1S26EgR-dC75hrhVnZGQisjust''effectivebrackets''[]withmore一些需要操纵字符串。我们也可以使用数据结构栈来解决问题。大部分可以用栈解决的问题都可以用递归来解决。两者的逻辑基本相同:输入:'3[a2[c]]'初始化栈:stacknumsstorage重复次数为k,将字符串存入栈str中遍历字符串:the指针指向字符'3',暂存数字3,供数字num继续遍历。strnums:3res:''num置0,str为空继续遍历,遇到字符'a',拼接字母'a'为字母空串res,res='a'继续遍历,遇到字符'2',暂存数字num为数字2,继续遍历字符'['num入栈nums,res入栈strnums:3->2str:''->'a'num设置为0,str为空继续遍历,遇到字符'c'时,将字母'c'拼接为字母空串res,res='c'继续遍历遇到的字符']'nums弹出栈顶元素:当前字符串的重复次数2res=res*2='cc'str弹出栈顶元素'a'并与res拼接入栈:res='a'+'cc'='acc'str:''->'acc'继续遍历,遇到字符']'弹出nums栈顶元素:当前的重复次数字符串3res=res*3='accaccacc'str从栈顶元素弹出空字符串''与res拼接入栈:res=''+'accaccacc'='accaccacc'str:'accaccacc'ends并返回res注意:由于重复次数可能大于10,所以在暂存数字时一定要妥善处理。比如num*10+currentnumbers在C++中可以直接修改拼接字符,但是Java不支持运算符重载。您可以使用StringBuilder或StringBuffer类。使用栈暂存的逻辑和递归基本相同,可以理解为用递归实现栈。python没有栈这样的数据结构,可以用list()数组或者双端队列deque()python可以只用一个栈来重复次数和元组形式的字符串,比如(num,res)使用堆栈:Java:classSolution{publicStringdecodeString(Strings){//初始化数据结构Stackstr=newStack<>();Stacknums=newStack<>();StringBuilderres=newStringBuilder();整数=0;for(charc:s.toCharArray()){//递归字符串if(c=='['){str.push(res);//pushnums.push(num);num=0;//刷新num,resres=newStringBuilder();}elseif(c==']'){StringBuildertmp=newStringBuilder();for(inti=nums.pop();i>0;i--)tmp.append(res);//res*3res=str.pop().append(tmp);}elseif(c>='0'&&c<='9')num=num*10+(c-'0');//计算重复次数elseres.append(c);}返回res.toString();}}Python:直接可操作字符串真的很方便py中有现成的判断字符串的方法:isdigit()是一个只包含数字的字符串isalpha()是一个只包含字母的字符串class解决方案:defdecodeString(self,s:str)->str:#初始化数据结构stack,res,num=[],'',0forcins:ifc.isdigit():num=num*10+int(c)elifc.isalpha():res+=celifc=='[':#将元组形式入栈stack.append((res,num))#刷新字符串和重复次数res,num='',0else:#Ifc==']',popupStringandrepetitionslast_str,this_num=stack.pop()res=last_str+this_num*resreturnres使用递归:Java:将s.length()的值作为参数传递,减少重复带来的时间损失callstolength()classSolution{privateinti=-1;//全局变量i,记录字符数组指针的位置publicStringdecodeString(Strings){returndfs(s.toCharArray(),s.length()).toString();}//递归函数privateStringBuilderdfs(char[]chars,intlen){intnum=0;StringBuilder海峡=新字符串生成器();while(++i='0'&&chars[i]<='9')num=num*10+(chars[i]-'0');elseif(chars[i]=='['){StringBuildertmp=dfs(chars,len);//递归调用while(--num>=0)str.append(tmp);//重复字符stringres=res*numnum=0;}elseif(chars[i]==']')返回str;否则str.append(chars[i]);}返回海峡;}}Python:classSolution:i=-1#递归函数,可以直接操作字符串,不用建dfs辅助函数defdecodeString(self,s:str)->str:res,num='',0whileself.i