【问题标题】:Given a string containing uppercase alphabets (A-Z), compress the string using Run Length encoding给定一个包含大写字母 (A-Z) 的字符串,使用运行长度编码压缩字符串
【发布时间】:2019-07-12 18:13:04
【问题描述】:

给定一个包含大写字母 (A-Z) 的字符串,使用运行长度编码压缩该字符串。必须通过存储该运行的长度来替换重复的字符。

我尝试了以下代码

#Code 1: Tried on my own


    def encode(message):
        list1=[]
        for i in range (0,len(message)):
            count = 1
            while(i < len(message)-1 and message[i]==message[i+1]):
                count+=1
                i+=1
                list1=str(count)+message[i]
                return list1
    encoded_message=encode("ABBBBCCCCCCCCAB")
    print(encoded_message)



Input:AAAABBBBCCCCCCCC  
Expected Output: 4A4B8C



#code 2:I tried this by looking at another code based on run-length encoding

    def encode(message):
        list1=[]
        count=1
        for i in range (1,len(message)):
            if(message[i]==message[i-1]):
                count+=1
            else:
                list1.append((count,list1[i-1]))
                count=1
            if i == len(messege) - 1 :
                list1.append((count , data[i]))
        return list1

    encoded_message=encode("ABBBBCCCCCCCCAB")
    print(encoded_message)

输入:AAAABBBBCCCCCCCC
预期输出:4A4B8C

第一个代码输出为 2B

【问题讨论】:

  • 第一个encode() 函数在内部while 循环中包含一个return 语句,这会导致函数立即退出。该循环只会运行一次。

标签: python string run-length-encoding


【解决方案1】:
def encode(message):
    pairs = []
    for char in message:
        if len(pairs) > 0:
            if pairs[-1][0] == char:
                pairs[-1] = (char, pairs[-1][1] + 1)
            else:
                pairs.append((char, 1))
        else:
            pairs.append((char, 1))
    strings = []
    for letter, count in pairs:
        strings.append(f"{count}{letter.upper()}")
    return "".join(strings)


print(encode("ABBBBCCCCCCCCAB"))
print(encode("AAAABBBBCCCCCCCC"))

这个输出:

1A4B8C1A1B
4A4B8C

【讨论】:

    【解决方案2】:

    这是对来自 itertools 的 groupby 函数的一个很好的用途:

    from itertools import groupby
    
    message = 'AAAABBBBCCCCCCCC'
    
    ''.join('{}{}'.format(len(list(g)), c) for c, g in groupby(message))
    

    【讨论】:

      【解决方案3】:

      根据您的代码 #2 方法,我对其进行了调整,以提供您在预期输出中的输出:4A4B8C

      基本上,您在列表中返回一个元组,因此您需要将其设为字符串并将您也使用的数据添加到其中,但没有数据变量,并且您尝试查找消息的内容,而不是您的列表,因此代码将是

      def encode2(message):
              encoded_return_message = ""
              count=1
              for i in range (1,len(message)):
                  if(message[i]==message[i-1]):
                      count+=1
                  else:
                      encoded_return_message += (f'{count}{message[i-1]}')
                      count=1
                  if i == len(message) - 1 :
                      encoded_return_message +=(f'{count}{message[i]}')
              return encoded_return_message
      
      encoded_message=encode2("ABBBBCCCCCCCCAB")
      print(str(encoded_message))
      

      我还在 Repl.it 上做了一个演示

      https://repl.it/repls/RowdyFloralwhiteBlockchain

      【讨论】:

        【解决方案4】:

        就我个人而言,我会使用re 模块按照以下方式完成该任务:

        import re
        text = 'AAAABBBBCCCCCCCC'
        def sub_function(m):
            span = m.span()
            return f"{span[1]-span[0]}"+m.groups()[0]
        out = re.sub(r'(\w)(\1*)',sub_function,text)
        print(out)
        

        输出:

        4A4B8C
        

        解释:re.sub 中的模式正在寻找字母后跟 0 或更多出现的相同字母,而不是每个这样的子字符串都被馈送到 sub_function 计算子字符串的总长度并返回与第一个字母连接的值(与所有其他相同)子字符串。请注意,我在代码中使用了旧版本中不可用的所谓 f-string(我在 Python 3.6.7 中测试了我的代码),如果您必须使用旧版本,则需要使用其他字符串格式化方法。另请注意,我的代码原样会将单个字母替换为数字1 加上该字母,例如输入ABC 将导致1A1B1C,如果您希望保留单个字母而不添加1,则更改@ 的第一个参数987654332@从r'(\w1)(\1*)'到r'(\w1)(\1+)'

        虽然也许现在我是那个拿着锤子到处看到钉子的人。

        【讨论】:

          【解决方案5】:
          def encode(message):
              count=0
              characters=''
              previous_char=message[0]
              result='' 
              length=len(message)
              i=0
              while(i!=length):
                 character=message[i]
                 if previous_char==character:
                    count=count+1
                 else:
                    result=result+str(count)+previous_char
                    count=1
                 previous_char=character
                 i=i+1
              return result+str(count)+str(previous_char)
          encoded_messsage=encode("ABBBBCCCCCCCCAB")
          print(encoded_message)  
          

          输入为:ABBBBCCCCCCCCAB

          输出为:1A4B8C1A1B

          【讨论】:

            【解决方案6】:
            def encodeString(s):
              encoded = ""
              ctr = 1
              for i in range(len(s)-1):
                if s[i]==s[i+1]:
                  ctr += 1
                  i += 1 
                else:
                  encoded = encoded + str(ctr) + s[i]
                  i += 1
                  ctr = 1
                #print(encoded)
              
              encoded = encoded + str(ctr) + s[i]
              #print(encoded)
              return encoded
            

            输入:“AAAAABBCCDDAB” 输出:5A2B2C4D1A1B

            【讨论】:

              【解决方案7】:
              def encode(message):
                  list1=[]
                  count=1
                  for i in range (1,len(message)):
                      if(message[i].upper()==message[i-1].upper()):
                          count+=1
                      else:
                          list1.append(f"{count}{message[i-1].upper()}")
                          count=1
                      if i == len(message) - 1 :
                          list1.append(f"{count}{message[i].upper()}")
                  return "".join(list1)
              
              encoded_message=encode("ABBBBCCCCCCCCAB")
              print(encoded_message)
              

              【讨论】:

              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-01-10
              • 2018-03-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-06
              相关资源
              最近更新 更多