题目描述
小摩手里有一个字符串A,小拜的手里有一个字符串B,B的长度大于等于A,所以小摩想把A串变得和B串一样长,这样小拜就愿意和小摩一起玩了。
而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,小拜就越喜欢。比如"abc"和"abd"对应相等的位数为2,为前两位。
小摩可以在A的开头或者结尾添加任意字符,使得长度和B一样。现在问小摩对A串添加完字符之后,不相等的位数最少有多少位?
输入描述:
第一行 为字符串A,第二行 为字符串B, A的长度小于等于B的长度,B的长度小于等于100。 字符均为小写字母。
输出描述:
输出一行整数表示A串添加完字符之后,A B 不相等的位数最少有多少位?
示例1
输入
abe cabc
输出
1
说明
这个题目可以转化到最长公共子串问题,答案就是str1.size()-LCS(str1,str2)
但是这里在递推的时候要注意必须有i<=j, 否则是能通过开头和结尾添加字符串得到相同元素的。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 找到字符串A和B的最长公共子串
int LSC(string str1, string str2)
{
// dp[i][j] 表示字串str1以i结尾的子串和字符串str2以j结尾的子串的最长公共子串
vector<vector<int>> dp(str1.size() + 1, vector<int>(str2.size() + 1, 0));
int res = 0;
for (int i = 1; i <= str1.size(); i++) {
for (int j = 1; j <= str2.size(); j++) {
if (str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
res = max(res, dp[i][j]);
}
}
return res;
}
int main()
{
string str1, str2;
cin >> str1;
cin >> str2;
int res = LSC(str1, str2);
cout << str1.size() - res << endl;
}