摩拜2019 校招 字符串问题

    xiaoxiao2022-07-06  189

    题目描述

    小摩手里有一个字符串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; }

     

    最新回复(0)