算法思想一:暴力枚举
解题思路:
枚举所有可能的X1和X2,然后计算替换之后的答案,从所有可能的答案中选取最小值
代码展示:
C++版本
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算最少的距离
* @param S1 string字符串 第一个字符串
* @param S2 string字符串 第二个字符串
* @return int整型
*/
int GetMinDistance(string S1, string S2) {
// write code here
// 定义最小值
int ans = 1e9;
// 双层循环枚举 X1和X2
for (char c = 'a'; c <= 'z'; c++) {
for (char d = 'a'; d <= 'z'; d++) {
int dist = 0;
// 在计算替换之后的答案
for (int i = 0; i < S1.size(); i++) {
char cur = S1[i] == c ? d : S1[i];
dist += (cur != S2[i]);
}
// 选择最小值
ans = min(ans, dist);
}
}
return ans;
}
}; 复杂度分析
时间复杂度:N表示字符串的长度,双层枚举遍历
可为
,还有一层替换计算距离时间
空间复杂度:仅使用常数级变量空间
算法思想二:矩阵替换
解题思路:
1、构造一个26*26零矩阵,将a-z对应为0-25的数字
2、循环将两个字符串转换为一个矩阵的形式,同时计算两个字符串之间原始的距离
3、再枚举替换的x1,x2,寻找最大的替换字符(变换字母最多能减少的距离)
4、使用原始距离减去最大可替换的字符距离,即为替换后字符之间最小距离
注意,在变换的时候,也将对应相同字母变成了不同字母,不要忽略
图解:
代码展示:
Python版本
class Solution:
def GetMinDistance(self , S1 , S2 ):
# write code here
dp = [[0] * 26 for i in range(26)] # 构造一个26*26零矩阵,将a-z对应为0-25的数字
diff = 0 # 字母不相同的个数,即距离
num = 0 # 变换字母最多能减少的距离
for i in range(len(S1)):
dp[ord(S1[i]) - ord('a')][ord(S2[i]) - ord('a')] += 1
# ord将字母变为ASCII码对应的数字, 将两个字符串变为一个矩阵表示
diff += (S1[i] != S2[i])
# 遍历替换
for i in range(26):
for j in range(26):
num = max(num, dp[i][j] - dp[i][i]) # 注意,在变换的时候,也将对应相同字母变成了不同字母,不要忽略
return diff - num 复杂度分析
时间复杂度:N表示字符串的长度,双层枚举遍历
可为
,字符串遍历时间
空间复杂度:辅助矩阵占用空间
,因为是常数则为



京公网安备 11010502036488号