文字列の圧縮解除の問題 - 貪欲アルゴリズム

 

インポートSYS 


DEF LOAD_DATA():
    戻りsys.stdin.read()


DEF get_position_map(S):
    結果= {} 
    スタック= [] 
    iについて、C列挙(S)で:
        "[" C ==場合:
            [結果私] = -1 
            stack.append(I)
        のelif C == "]":
            もしスタック:
                POS = stack.pop()
                結果[POS] = iが
    生じる戻り


:DEF decode_str(S、開始、終了、pos_map)
    DEF IN_RANGEを(I、開始、終了):
        復帰開始<= I <エンド

    DEF is_str(C):
        戻りORD( 'A')<= ORD(C)<= ORD( 'Z')またはORD( 'A')< = ORD(C)<= ORD( 'Z') 

    DEF IS_NUM(C):) 
        リターンワード( '0')<=ワード(C)<=ワード( '9')

    結果= "" 
    I =開始
    IN_RANGE(I、開始、終了)しつつ:
        文字列= "" 
        IN_RANGE(I、開始、終了)およびis_strは(S [I])中:
            文字列+ =のS [i]は
            、I + = 1 

        :IN_RANGEない場合(私は、終了、開始)
            戻り列

        "" =桁
        :IS_NUM(S [i])とIN_RANGEは(iは、開始、終了)しながら
            桁+ = S [i]は
            、I + = 1 

        IN_RANGEない場合( I、開始、終了):
            リターン文字列を

        pos_map場合[I] == -1:
            戻り列
 
        d_str = decode_str(S、I + 1、pos_map [i]は、pos_map)
        結果+ =文字列+ d_str * INT(桁)

        I = pos_map [i]は1 
    の戻り結果


DEFメイン():
    encoded_str = LOAD_DATA()# "ABC3 [xyz4 [MN]" # "ABC3 [XYZ" # "ABC2 [xyz3 [MN]" # "aaabcbc" # "3 [A] 2 [BC]" 
    pos_map = get_position_map(encoded_str)
    decoded_str = decode_str(encoded_str、0、LEN(encoded_str)、pos_map)
    プリント(decoded_str)


__name__場合== "__main__":
    main()の

  

おすすめ

転載: www.cnblogs.com/bonelee/p/11580584.html