小摩手里有一个字符串A,小拜的手里有一个字符串B,B的长度大于等于A,所以小摩想把A串变得和B串一样长,这样小拜就愿意和小摩一起玩了。
而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,小拜就越喜欢。比如"abc"和"abd"对应相等的位数为2,为前两位。
小摩可以在A的开头或者结尾添加任意字符,使得长度和B一样。现在问小摩对A串添加完字符之后,不相等的位数最少有多少位?
示例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; }