【字符串】FBI樹

題目鏈接:https://ac.nowcoder.com/acm/problem/16660
在這裏插入圖片描述

思路:

題目要讓我們做的是,將01構成的字符串轉換爲由BIF字符構成的樹的後序遍歷。
首先,(拿10001011做例子)根節點爲F,原因是10001011即包含0又包含,然後
第一次將字符串二分,成爲1000+1010,左子樹爲F(1000),右子樹爲F(1010)
第二次進行二分,成爲10+00 ,變成F+B,分別表示1000的左子樹和右子樹,以及10+10,變成F+F,分別表示1010的左子樹和右子樹
第三次進行二分,成爲1 0 0 0 1 0 I 0,也就是葉子結點,分別變成,I B B B I B I B
圖就懶得畫了,就是一棵樹結構的模樣
這裏我們可以利用歸併排序的思路來做,首先將01字符串進行二分,然後將單個字符兩兩鄰居合併,合併的同時保存合併的結果,可以發現遞歸二分和歸併得到的結果正好就是樹的後序遍歷
如10001010:二分完成後變爲1 0 0 0 1 0 1 0 ,第一次歸併得到10 00 第二次歸併得到1000,第三次歸併得到10 10 第四次歸併得到1010,第三次得到10001010,這樣保存的結果正好就是10 00 1000 10 10 1010 10001010,也就是樹的後序遍歷(不包括葉子節點),如何得到葉子節點呢?我們可以在歸併的同時,判斷歸併的結果,其字符串長度是否爲2,如果爲2,就說明這次歸併是通過歸併葉子節點得到的,然後進行輸出。對於轉換爲FBI字符,就比較好判斷了,直接進行判斷是否全1,全0,或都有即可
代碼如下:

n = int(input())
string = input()
ans = []
def JugAns(string):#判斷字符串的類型
    if string.find('1')!=-1 and string.find('0')!=-1:return 'F'       #都有
    elif string.find('1')!=-1 and string.find('0')==-1:return 'I' #只有1
    else: return 'B'
def Merge(string,low,high):#歸併
    if low==high-1:
        ans.append(string[low]);ans.append(string[high])
    ans_temp = ''
    for i in range(low,high+1):
        ans_temp = ans_temp+string[i]
    ans.append(ans_temp)
def Split(string,low,high):#二分遞歸拆分
    if low >= high:
        return
    mid = (high+low)//2
    Split(string,low,mid)
    Split(string,mid+1,high)
    Merge(string,low,high)
if len(string)==1:print(JugAns(string))#如果長度爲1,直接輸出
else:
    Split(string,0,len(string)-1)
    for i in ans:
        print(JugAns(i),end='')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章