题目:
描述
给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串?
一次操作可以在任意位置插入一个字符,或者删除任意一个字符,或者把任意一个字符修改成任意其他字符。
输入
字符串 S。S 的长度不超过100, 只包含'A'-'Z'。
输出
最少的修改次数。
样例输入
ABAD
样例输出
1
怎么说呢,历尽好几个心路历程吧,最简单的思想了,虽然超时了
从dp[0][n]开始,如果s[0]==s[n],那么dp[0][n] = dp[1][n-1]
如果不相等,那么就进行增删改的操作
又因为增和删是一样的,所以只分析在前面加字符和在后面加字符,还有改动字符
//在前面加字符的操作:dp[0][n] = dp[1][n]+1;
//在后面加字符的操作:dp[0][n] = dp[0][n-1]+1;
//改的操作:dp[0][n] = dp[1][n-1]+1;
最终选的就是三个操作中最小的
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str = sc.next();
int n = str.length();
char c[] = str.toCharArray();
int dp[][] = new int[n][n];
dfs(c,dp,0,n-1);
System.out.println(dp[0][n-1]);
}
public static int dfs(char c[],int dp[][],int start,int last) {
if(last<0 || start>last)
return 0;
if(c[last]==c[start]) { //外边两个字符相等的时候那么就对里面的字符进行操作
return dp[start][last] = dfs(c,dp,start+1,last-1);
}else {
//在左边增加一个字符
int a = dfs(c,dp,start+1,last)+1;
int b = dfs(c,dp,start,last-1)+1;
int m = dfs(c,dp,start+1,last-1)+1; //改字符操作
return dp[start][last]=Math.min(Math.min(a,b), m);
}
}
}