华为机考真题 -- 两个字符串间的最短路径问题

题目描述:

给定两个字符串,分别为字符串 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值