描述:
一个字符串,如果从左到右读和从右到左读是完全一样的,比如"aba",我们称其为回文串。现在给你一个字符串,可在任意位置添加字符,求最少添加几个字符,才能使其变成一个回文串。
输入格式:
任意给定的一个字符串,其长度不超过1000.
输出格式:
能变成回文串所需添加的最少字符数。
输入样例:
Ab3bd
Abb
输出样例:
2
1
import java.util.Scanner;
@SuppressWarnings("all")
public class Palindrome_string_problem {
public static void main(String args[]){//回文串问题 动态规划
String string = new String();//多余
Scanner scanner = new Scanner(System.in);
string = scanner.next();
char []dp = string.toCharArray();
System.out.println(changeToPalindrome(dp));
}
static int changeToPalindrome(char []src){
if(src.length == 0){return 0;}
int length = src.length;
int i,j,len;
int [][]dp = new int[length][length];
for(int n = 0;n < length;n++){//初始化 在java里面多余 初始值就是0 浪费时间和复杂度
for(int m = 0;m < length;m++){
dp[n][m] = 0;
}
}
for(len = 2;len <= length;len++){
for(i = 0;i + len - 1 < length;i++){
j = i + len - 1;//j 表示大于i 小于 length 之间的一个字符的位置
if(src[i] == src[j]){//dp[i][j]表示i到j共需要填充多少字符,当相等时就将上一层的复制这一层就行
dp[i][j] = dp[i + 1][j - 1];
}
else{
dp[i][j] = 1 + Math.min(dp[i + 1][j],dp[i][j - 1]);//表示向前或后添加一个字符
}
}
}
return dp[0][length - 1];
}
}