字符串相似度(动态规划)

# 问题描述

给定一段受损的 DNA 碱基序列 dna1,在每次只操作一个碱基的情况下,将其以最少的操作步骤将其还原到未受损的 DNA 碱基序列 dna2。

只可以对 DNA 碱基序列中的一个碱基进行三种操作:
1. 增加一个碱基
2. 去除一个碱基
3. 替换一个碱基

## 输入描述:

输入两段 DNA 碱基序列,每段分一行输入

第一行为第一段受损的 DNA 碱基序列 dna1

第二行为第二段未受损的 DNA 碱基序列 dna2

## 输出描述:

最小操作步骤数

**备注**:

0 <= dna1.length, dna2.length <= 500

dna1 和 dna2 由大写英文字母 A、G、C、T 组成

**示例 1**

**输入**

AGCTTAGC

AGCTAGCT

**输出**

2

**说明**

AGCTTAGC -> AGCTAGC(删除 T)

AGCTAGC -> AGCTAGCT(增加 T)


**示例 2**

**输入**

AGCCGAGC

GCTAGCT

**输出**

4

**说明**

AGCCGAGC -> GCCGAGC(删除 A)

GCCGAGC -> GCTGAGC(将 C 替换为 T)

GCTGAGC -> GCTAGC(删除 G)

GCTAGC -> GCTAGCT(增加 T)

算法分析: 

  • 它通过递归比较两个字符串,考虑插入、删除和替换操作来计算需要的最小编辑次数

代码: 

public class Main {
    public static int correct_len(String dna1, String dna2, int ans) {
        if (dna1 == "") {
            return ans + dna2.length();
        } else if (dna2 == "") {
            return ans + dna1.length();
        } else if (dna1.charAt(0) == dna2.charAt(0)) {
            return correct_len(dna1.substring(1), dna2.substring(1), ans);
        }
        return Math.min(correct_len(dna2.charAt(0) + dna1, dna2, ans + 1), Math.min(
                correct_len(dna1.substring(1), dna2, ans + 1),
                correct_len(dna1.substring(1), dna2.substring(1), ans + 1)));
    }

    public static int solution(String dna1, String dna2) {
        return correct_len(dna1, dna2, 0);
    }

    public static void main(String[] args) {
        // You can add more test cases here

        System.out.println(solution("AGCTTAGC", "AGCTAGCT") == 2);
        System.out.println(solution("AGCCGAGC", "GCTAGCT") == 4);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值