zoukankan      html  css  js  c++  java
  • 最短编辑距离

    最短编辑距离

    牛客题库连接

    __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()
    
    
  • 相关阅读:
    Java设计模式—模板方法模式
    STM32 常用GPIO操作函数记录
    GPIO 配置之ODR, BSRR, BRR 详解
    STM32F4先设置寄存器还是先使能时钟
    LDR指令的格式:
    printf函数重定向
    stm32F4各个库文件的作用分析
    STM32F4时钟设置分析
    STM32F407存储器和总线架构
    SPI移位寄存器
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/13893204.html
Copyright © 2011-2022 走看看