暴力解法:
枚举所有可能的X1和X2,然后计算替换之后的答案,从所有可能的答案中选取最小值
复杂度O(26 * 26 * N)
/**
* 计算最少的距离
* @param S1 string字符串 第一个字符串
* @param S2 string字符串 第二个字符串
* @return int整型
*/
int GetMinDistance(string S1, string S2) {
int ans = 1e9;
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;
}正解:
对于所有可能的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;
}
京公网安备 11010502036488号