• 最短编辑距离


    最短编辑距离

    牛客题库连接

    __author__ = 'Jade'
    """
        solve minimum Edit Distance , time is O(nm) , space is O(nm)    
    """
    
    def findAStrtoBStrMinSteps(a_str , b_str):
        a_str_len , b_str_len = len(a_str) , len(b_str)
        dp = [[0 for j in range(b_str_len + 1)] for i in range(a_str_len + 1)]
        for i in range(a_str_len + 1):
            dp[i][0] = i
        for i in range(b_str_len + 1):
            dp[0][i] = i
        operator_list = list()
        for i in range(a_str_len):
            for j in range(b_str_len):
                dp[i + 1][j + 1] = min(dp[i][j + 1] + 1 , dp[i + 1][j] + 1 , dp[i][j] if a_str[i] == b_str[j] else dp[i][j] + 1)
        a_str_index , b_str_index = a_str_len , b_str_len
    
        while(a_str_index >= 1 or b_str_index >= 1):
            if(dp[a_str_index][b_str_index] == dp[a_str_index][b_str_index - 1] + 1):
                operator_list.append({"type":"add","index":b_str_index,"value":b_str[b_str_index - 1]})
                b_str_index -= 1
            elif(dp[a_str_index][b_str_index] == dp[a_str_index - 1][b_str_index] + 1):
                operator_list.append({"type":"del","index":a_str_index})
                a_str_index -= 1
            else:
                if(dp[a_str_index][b_str_index] == dp[a_str_index - 1][b_str_index - 1] + 1):
                    operator_list.append({"type":"update","index":a_str_index,"value":b_str[b_str_index - 1]})
                a_str_index -= 1
                b_str_index -= 1
    
        operator_list.reverse()
        return operator_list , dp[a_str_len][b_str_len]
    
    def main():
        a_str = input()
        b_str = input()
        operator_list , mininum_steps = findAStrtoBStrMinSteps(a_str , b_str)
        print('%s transform %s need mininum %d steps'%(a_str , b_str , mininum_steps))
        print('operators as follow:')
        for opt in operator_list:
            if(opt.get('type') == "del"):
                print(opt.get('type'),opt.get('index'))
            else:
                print(opt.get('type') , opt.get("index") , opt.get('value'))
    
    def test():
        while True:
            try:
                a_str , b_str = input().split()
                operator_list , minimum_steps = findAStrtoBStrMinSteps(a_str , b_str)
                print(minimum_steps)
            except:
                break
    
    if __name__ == '__main__':
        test()
    
    
  • 相关阅读:
    无线安全
    下载安装Emacs和基本配置--待更新中
    uv-pv-vv的区别
    tesseract安装及问题处理
    POJ 2187 Beauty Contest【凸包周长】
    POJ 1113 Wall【凸包周长】
    POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
    POJ 2031 Building a Space Station【经典最小生成树】
    URAL 1181 Cutting a Painted Polygon【递归+分治】
    POJ 1845-Sumdiv【经典数学题目---求因子和】
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/13893204.html
Copyright © 2020-2023  润新知