zoukankan      html  css  js  c++  java
  • 字符串解码DecodeString

    字符串解码

    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)

  • 相关阅读:
    Lucene
    SQL优化以及索引
    Mysql优化
    RocketMQ
    RocketMQ
    Session共享
    Linux安装Nginx
    初识nginx
    跨域,防止表单重复提交
    HttpClient案例
  • 原文地址:https://www.cnblogs.com/xhslovecx/p/7732174.html
Copyright © 2011-2022 走看看