<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span>
#include <string>
#include <vector>
using namespace std;
// 将一个字符串转换为回文字符串的最小代价
// 转换操作包括三种:add, delete, replace 一个字符
// 比如将"abcdef" 转换成“abccba”最少需要3步
// 方法一,DP, 状态方程 f[i][j] 表示将以i开始j结尾的字符串转换为回文字符串的最小代价
// 如果 str[i] == str[j] , 那么只需考虑,f[i+1][j-1]的情况
// 如果 str[i] != str[j], 那么考虑三种操作,
// 1) delete str[j], 加上将[i, j-1] 字符转换为回文串的最小代价
// 2)delete str[i], 加上将[i+1, j] 字符转换为回文串的最小代价
// 3) replace str[i] with str[j] (or vice verse), 加上将[i+1, j-1] 字符转换为回文串的最小代价
int minPath(string str){
if(str.length() <= 1){
return 0;
}
int n = str.length();
vector<vector<int> > f(n, vector<int>(n, 0));
for(int i = n - 2; i >= 0; i--){
for(int j = i+1; j < n; j++){
if(str.at(i) == str.at(j)){
f[i][j] = f[i+1][j-1];
}
else {
f[i][j] = min(f[i+1][j-1],
min(f[i][j-1], f[i+1][j]))
+ 1;
}
}
}
return f[0][n-1];
}
// 方法二,思想同方法一,只不过这里用递归
int minPath2(string str){
if(str.length() <= 1){
return 0;
}
int i = 0; int j = str.length() - 1;
if(str.at(i) == str.at(j)){
return minPath2(str.substr(i+1, j - i + 1));
}
else {
return min(minPath2(str.substr(i+1, j-1 -i)),
min(minPath2(str.substr(i, j-i)), minPath2(str.substr(i+1, j -i))))
+ 1;
}
return 0;
}
int main()
{
std::string name = "x";
std::cout << minPath(name)<<endl;
std::cout << minPath2(name)<<endl;
}