题目描述:
给定两个字符串,分别为字符串 A 与字符串 B。例如 A 字符串为 ABCABBA,B 字符串为 CBABAC 可以得到下图 m*n 的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为 1,映射成坐标系如下图。
从原点(0, 0)到(0, A)为水平边,距离为 1,从(0, A)到(A, C)为垂直边,距离为1;假设两个字符串同一位置的两个字符相同则可以作一个斜边,如(A, C)到(B, B)最短距离为斜边,距离同样为 1。作出所有的斜边如下图,(0, 0)到(B, B)的距离为 1 个水平边 + 1 个垂直边 + 1 个斜边 =3。
输入描述:
空格分割的两个字符串A与字符串B,字符串不为“空串”,字符串格式满足正则规则:[A~Z],字符串长度L<10000;
输出描述:
原点到终点的最短距离
示例1:
输入
ABC ABC
输出
3
示例2:
输入
ABCABBA CBABAC
输出:
9
C++源码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
string line;
while (getline(cin, line)) {
string str1, str2;
str1 = line.substr(0, line.find(' '));
str2 = line.substr(line.find(' ') + 1);
int lenA = str1.size();
int lenB = str2.size(); // 行
vector<vector<int>> dp(lenB + 1, vector<int>(lenA + 1, 0));
for (int i = 0; i <= lenA; ++i) {
dp[0][i] = i;
}
for (int row = 1; row <= lenB; ++row) {
dp[row][0] = row;
for (int col = 1; col <= lenA; ++col) {
if (str1[col - 1] == str2[row - 1]) {
dp[row][col] = min(dp[row - 1][col], min(dp[row][col - 1], dp[row - 1][col - 1])) + 1;
}
else {
dp[row][col] = min(dp[row - 1][col], dp[row][col - 1]) + 1;
}
}
}
cout << dp[lenB][lenA] << endl;
//if (cin.get() == '\n')
//{
// break;
//}
}
system("pause");
return 0;
}