https://blog.csdn.net/C20190413/article/details/75030105
#include<iostream> #include <stdio.h> #include <stack> #include <string> #include <vector> #include <math.h> #include <limits.h> using namespace std; class Solution { public: /** * 计算最少的距离 * @param S1 string字符串 第一个字符串 * @param S2 string字符串 第二个字符串 * @return int整型 */ int min_fuc(int x,int y,int z) //algorithm库的min只有两个参数(即只能对两个数进行判定),所以我自己写了一个min函数 { if(x<=y&&x<=z) return x; else if(y<=x&&y<=z) return y; else return z; } int GetMinDistance(const string& S1, const string& S2) { // write code here int dp[S1.length()+1][S2.length()+1]; for (int i = 0; i<= S1.length(); i++) for (int j = 0; j<= S2.length(); j++) { if (i == 0) { dp[i][j] = j; continue; } if (j == 0) { dp[i][j] = i; continue; } if (S1[i-1] == S2[j-1]) { dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = 1 + min_fuc(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]); } } /*int num = 0; for (int i=0; i< S1.length()+1; i++) for (int j=0; j< S2.length()+1; j++) { cout << dp[i][j] << " "; num ++; if (num == S2.length()+1) { cout << endl; num = 0; } } */ return dp[S1.length()][S2.length()]; } }; int main() { const string str1 = "aaa"; const string str2 = "bbb"; Solution sl; int dis = sl.GetMinDistance(str1, str2); cout << dis << endl; return 0; }
======牛客另外一题===============
给定两个长度相等的,由小写字母组成的字符串S1和S2,定义S1和S2的距离为两个字符串有多少个位置上的字母不相等。
现在牛牛可以选定两个字母X1和X2,将S1中的所有字母X1均替换成X2。(X1和X2可以相同)
牛牛希望知道执行一次替换之后,两个字符串的距离最少为多少
链接:https://www.nowcoder.com/questionTerminal/82bd533cd9c34df29ba15bbf1591bedf?answerType=1&f=discussion 来源:牛客网 正解: 对于所有可能的X1, X2, 记录cnt[X1][X2]有多少个位置i, 使得S1[i] == X1, S2[i] == X2 这一步只需扫描一遍字符串即可计算得到 然后枚举可能的X1, X2,这时距离 = 原本的距离 + cnt[X1][X1] - cnt[X1][X2] 时间复杂度O(N) /** * 计算最少的距离 * @param S1 string字符串 第一个字符串 * @param S2 string字符串 第二个字符串 * @return int整型 */ int GetMinDistance(string S1, string S2) { int cnt[26][26]; for (int i = 0; i < 26; i++) { for (int j = 0; j < 26; j++) { cnt[i][j] = 0; } } int n = S1.size(); int sum = 0; for (int i = 0; i < n; i++) { int a = S1[i] - 'a', b = S2[i] - 'a'; cnt[a][b]++; sum += (a != b); } int ans = sum; for (int i = 0; i < 26; i++) { for (int j = 0; j < 26; j++) { ans = min(ans, sum + cnt[i][i] - cnt[i][j]); } } return ans; }