题目描述
给定两个长度相等的,由小写字母组成的字符串S1和S2,定义S1和S2的距离为两个字符串有多少个位置上的字母不相等。
现在牛牛可以选定两个字母X1和X2,将S1中的所有字母X1均替换成X2。(X1和X2可以相同)
牛牛希望知道执行一次替换之后,两个字符串的距离最少为多少。
方法一:暴力方法
求解思路
对于本题目,给出的条件中,因为全是小写字母,我们替换的X1和X2也都是小写字母,因此我们可以暴力枚举所有的小写字母作为被替换和替换的情况,然后分别计算每种情况的距离,然后从中求出最小值即可。
解题代码
class Solution {
public:
int GetMinDistance(string S1, string S2) {
int myres = INT_MAX;
for(char c1 = 'a'; c1 <= 'z'; c1++)
{
for(char c2 = 'a'; c2 <= 'z'; c2++)
{
int temp = 0; // 声明临时变量
for(int i = 0; i < S1.length(); i++)
{
if(S1[i] == c1) // 计算距离
{
S1[i] = c2;
temp = S1[i] != S2[i] ? temp + 1 : temp; // 增加距离
S1[i] = c1;
}
else if(S1[i] != S2[i]) // 没有替换
temp++; // 距离增加
}
myres = min(myres, temp); // 取最小值
}
}
return myres; // 返回结果
}
};复杂度分析
时间复杂度:外层为常数级循环,内层为一层循环,因此时间复杂度为
空间复杂度:没有引入额外的内存地址空间,因此空间复杂度为
方法二:优化方法--矩阵替换
求解思路
对于方法一,每次循环替换字母,然后计算距离。我们对其进行优化,首先我们计算字符串的初始距离,然后用一个26*26的矩阵表示各个字母,替换之后相同的字符数,扫描一遍矩阵后,找到替换以后的减少最多的字符,最后即可得到本题的答案。
解题代码
class Solution {
public:
int GetMinDistance(string S1, string S2) {
int myres = INT_MAX; // 声明结果
vector<vector<int> > mydp(26, vector<int>(26, 0));
int temp = 0; // 声明临时变量
for(int i = 0; i < S1.length(); i++)
{
mydp[S1[i]- 'a'][S2[i] - 'a']++;
if(S1[i] !=S2[i]) // 记录初始距离
temp++; // 更新临时变量
}
for(int i = 0; i < 26; i++)
{
for(int j = 0; j < 26; j++)
{ //遍历矩阵,找到最小距离
myres = min(myres, temp + mydp[i][i] - mydp[i][j]); // 替换之后减少的距离
}
}
return myres; // 返回结果
}
};复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:辅助数组dp[26][26],常数级内存空间,因此空间复杂度为

京公网安备 11010502036488号