[アルゴリズム]圧縮プログラム2次文字列


def solution(s):
    
    lenS = len(s)
    num = 1
    result = []
    
    if lenS == 1:
        return 1
    
    while True:
        stack = []
        for i in range(0, lenS):
            if i % num == 0:
                stack.append(s[i:i+num])
        
        if len(stack) == len(s):
            result.append(stack)
    
        if len(stack) != 1:
            result.append(stack)
                
        num += 1   
        if num == lenS + 1 :
            break
            
    kikiki = 1000
    for answer in result:
        new = []
        index = 0
        k = 0
        while True:
            if answer[index] == answer[index+1]:
                index += 1

            else:
                new.append(answer[k:index+1])
                k = index + 1
                index += 1

            if index == len(answer)-1:
                new.append(answer[k:index+1])
                break

        new_str = ''
        for n in new:
            if len(n) != 1:
                new_str += str(len(n))
            new_str += str(n[0])
        
        if len(new_str) < kikiki:
            kikiki = len(new_str)
    
    return kikiki

I/O例



解法

  • aabbaccc一つ、二つ...八つに切る.たとえば、1つを基準として切り取る場合は、スタックに配置し、resultに再配置します.
  • numが文字列長+1の場合、while文を終了します.
  • resultでの並びをそれぞれ答えと呼ぶ.答えが'a', 'a', 'b', 'b', 'a', 'c', 'c', 'c'の場合、ループではindexとindex+1を組み合わせます.この例では、newには['a', 'a', 'b', 'b', 'a', 'c', 'c', 'c']が含まれる.
  • new strは[['a', 'a'], ['b', 'b'], ['a'], ['c', 'c', 'c']]sの長さは1000以下でkikikiにsの長さを指定し、new strの長さがkikikiより小さい場合はnew strを指定します.