本质上是一个求最近公共祖先的问题,关键要解决的问题是把输入转换成一个树形结构,这里仍然是用字典来存储:

针对给定的样例["01011","10100","01000","10000","10000"],1,2

以当前节点为key,关联节点为value列表,可以转换为:

{
0:[1,3,4],
1:[0,2],
2:[1],
3:[0],
4:[0]
}

然后使用深度优先递归查找目标节点,把经过的路径以列表记录下来即可。

然后两个节点的路径对比,找到最后的相同元素即为最近的公共祖先。

代码如下:

class Solution:
    def Git(self , matrix: List[str], versionA: int, versionB: int) -> int:
        # write code here
        
        global alist,blist
        alist=[]#用来保存a的路径
        blist=[]#用来保存b的路径
        tree={}
        for i in range(len(matrix)):#整理为字典,树形结构
            tree[i]=[]
            relation=list(matrix[i])
            index=0
            while len(relation)>0:
                r=relation.pop(0)
                if r=="1":
                    tree[i].append(index)
                index+=1
        
        def walk(tmplist,pre,node):
            tmplist.append(node)
            if node ==versionA:#找到a,保存路径
                global alist
                alist=tmplist.copy()
            if node == versionB:#找到b,保存路径,注意这里a和b可能是同一个值,所以不要用else
                global blist
                blist=tmplist.copy()
            for i in tree[node]:#遍历执行下级节点
                if i == pre:#注意跳过来时的节点
                    continue
                walk(tmplist,node,i)
                tmplist.pop()
        walk([],0,0)
        res=0
        while len(alist)>0 and len(blist)>0:#逐个弹出首位比较,直到不相同或者路径为空
            a=alist.pop(0)
            b=blist.pop(0)
            if a==b:
                res=a
            else:
                break
        return res