题目描述:
已知在DNA中存在四种碱基AGCT,不专业地认为基因变异会发生以下事件:1.碱基类型突变; 2.碱基增加;3.碱基缺失,两段DNA序列计算出从左变更为右边所需要的最少变异步数,例如AACGT至少需要变异2次才能成为ACCGGT。
分析:
编辑距离问题:将一个字符串转换成另一个字符串所需的最少单个字符编辑(插入、删除或替换)操作次数,是Levenshtein距离的一个特例。
代码实现:
import java.util.Scanner;
public class t2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//int a= Integer.parseInt(in.nextLine());
int a=in.nextInt();
in.nextLine();
for(int i=0;i<a;i++){
String dna=in.nextLine();
String[] dnaS=dna.split(" ");
String dna1=dnaS[0];
String dna2=dnaS[1];
int dis=minDis(dna1,dna2);
System.out.println(dis);
}
}
public static int minDis(String s1,String s2){
int m=s1.length();
int n=s2.length();
if(n==m){
int mu=0;
for (int i = 0; i < m; i++) {
if(s1.charAt(i)!=s2.charAt(i)){
mu++;
}
}
return mu;
}
int[][] dp=new int[m+1][n+1];
for(int i=0;i<=m;i++){
dp[i][0]=i;
}
for(int j=0;j<=n;j++){
dp[0][j]=j;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(s1.charAt(i-1)==s2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
}else {
dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1]);
dp[i][j]=Math.min(dp[i][j],dp[i][j-1])+1;
}
}
}
return dp[m][n];
}
}
注意事项:
1.next(),nextLine(),nextInt()输入方法的区别;