字符串解码

原创博客,转载请注明出处!
eg:
ss=2[abc]3[cd]ef   return:abcabccdcdcdef
ss=3[a2[c]]2[a]    return:accaccaccaa
ss=10[abc]3[cd]ef return:abcabcabcabcabcabcabcabcabcabccdcdcdef
如何实现前面例子的效果呢?

首先分析s='2[abc]',要得到字符串'abcabc'非常容易
In [102]: int(s[0])*s[2:5]
Out[102]: 'abcabc'
其中,s[2:5]中的2代表‘[’之后的位置,5代表‘]’的位置,那么我就有启发了,如果我能得到‘[]’之间的内容以及‘[’前面的数字,就可以完成一个中括号之间的字符串相乘了。
1、首先找到第一个匹配的中括号[],可以遍历整个字符串。找到一个‘[’就用index_1记录下来,继续遍历,当下一个'['出现的时候,index_1的值会更新,直到找到‘]’记录位置index_2,此时的‘index_1和index_2就是要找的第一个'[]'。
2、获取index_1到index_2的内容
3、获取index_1前面的数字,注意数字可能是很多位数。从index_1的前一个开始遍历,如果是数字就加入字符串num里面,注意要加在字符串的前面,直到第一个非数字出现,则跳出for循环。
具体代码如下:
def onestr(ss):  
    for i in range(len(ss)):
        if ss[i] == '[':
            index_1=i #记录方括号开始的位置
            #print(index_1)
        if ss[i]==']':
            index_2=i #记录方括号结束的位置
            temp=ss[index_1:index_2+1] #取出方括号开始以及结束的位置
            #取出方括号[前面的数字,由于数字可能为多位,所以用while循环实现
            num=''
            j=1
            while(1):
     #从[的前一个位置开始找,直到不是数字为止
                if ss[index_1-j].isdigit():
                    num=ss[index_1-j]+num #num为字符串类型
                    j=j+1
                    continue
                else:
                    break
            break
    return temp,num
onestr('2[abc]3[cd]ef')
一次操作的结果为:
temp,num='[abc]','2'
将abc和2相乘的结果,替换掉源字符串2[abc]
ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']'))
由于temp='[abc]',直接相乘会把[]符号也乘进去,因此需要去掉两边的符号。
ss=abcabc3[cd]ef
一个方括号需要一次相乘,n个方括号就需要n次相乘,因此一个while循环,循环条件为方括号的个数,即可实现整个字符串的替换。
ss=input()
print(ss)
i=0
N=ss.count('[')
while(i<N):
     str_temp,num=onestr(ss)     ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']'))     i=i+1
print(ss)

程序代码:

def onestr(ss):  
    for i in range(len(ss)):
        if ss[i] == '[':
            index_1=i #记录方括号开始的位置
        if ss[i]==']':
            index_2=i #记录方括号结束的位置
            temp=ss[index_1:index_2+1] #取出方括号开始以及结束的位置
            num=''
            j=1
            while(1):
                if ss[index_1-j].isdigit(): #从[的前一个位置开始找,直到不是数字为止
                    num=ss[index_1-j]+num #num为字符串类型
                    j=j+1
                    continue
                else:
                    break
            break
    return temp,num
ss=input()
print(ss)
i=0
N=ss.count('[')
while(i<N):
    str_temp,num=onestr(ss)
    ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']'))
    i=i+1
print(ss)

字符串解码DecodeString的更多相关文章

  1. LeetCode 394. 字符串解码(Decode String) 44

    394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...

  2. Java实现 LeetCode 394 字符串解码

    394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k ...

  3. [PHP]对Json字符串解码返回NULL的一般解决方案

    ---------------------------------------------------------------------------------------------------- ...

  4. unicode字符串解码显示

    # encoding: utf-8 ''' unicode字符串解码显示 ''' import sys reload(sys) sys.setdefaultencoding('utf-8') a = ...

  5. [Swift]LeetCode394. 字符串解码 | Decode String

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  6. [Leetcode]394.字符串解码

    题目与解释 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正 ...

  7. Q394 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. 你可 ...

  8. 394 Decode String 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串.编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数.你可以认 ...

  9. LeetCode 394:字符串解码 Decode String

    题目: 给定一个经过编码的字符串,返回它解码后的字符串. Given an encoded string, return its decoded string. 编码规则为: k[encoded_st ...

随机推荐

  1. Java第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  2. Eclipse rap 富客户端开发总结(10) : Rap不同系统间的差异和处理方式

    平常进行 rap 程序开发一般都是在 win 下面完成 , 然后在 tomcat 下面测试 , 但是程序最终发布一般都是在 linux  aix 上面 , 这个时候就有能会出现一下问题,下面 2 个问 ...

  3. Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...

  4. linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法

    一.vi文字处理器1.vi与vimvi:文字处理器vim:程序开发工具2.vi介绍三种模式:一般模式(vi刚进入的,不可编辑),编辑模式(按i后,左下方是insert)和命令行模式(按esc退出,:w ...

  5. 转 Java输入输出流详解(非常详尽)

    转  http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...

  6. Mybatis(1)

    properties 标签的作用引入外部properties 文件的内容typeAliases 的作用可以用package这个标签批量给这个包下的所有类起一个别名 name属性写包的名字. 默认别名为 ...

  7. 判断字符串中是否包含指定的内容&&字符串截取方法比较说明

    1.使用indexOf()方法 方法说明: 作用:indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置(从前向后查找). 语法:stringObject.indexOf(searc ...

  8. GitHub使用(一) - 新建个人网站

    1.首先进入“仓库Repositories”,点击“新建New”.

  9. HTML 简述

    1.本页超链接 <a href="#t">查看 Chapter 4.</a> <a name="t">Test</a& ...

  10. 实际开发--->php时间函数

    当前日期(例:2017-10-04):date('Y-m-d',time()); 当前时间戳:strtotime(date('Y-m-d H-i-s',time()); 当前年月(例:2017-10) ...