#include <algorithm>
#include <cassert>
#include <memory>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算最少的距离
     * @param S1 string字符串 第一个字符串
     * @param S2 string字符串 第二个字符串
     * @return int整型
     */
    int GetMinDistance(string S1, string S2) {
        assert(S1.size() == S2.size());
        // 小写字母数量比较少,因此直接遍历26*26空间,少遍历整个字符串
        vector<vector<int>> mat(26, vector<int>(26,
                                                0)); //保存把某个字母换成某个字母的距离
        for (int i = 0; i < S1.size(); i++) { //尽量只遍历一次字符串
            for (int j = 0; j < 26; j++) {
                for (int k = 0; k < 26; k++) {
                    mat[j][k]++;
                    if (S1[i] - 'a' == j && S2[i] - 'a' == k) {
                        mat[j][k]--;
                    }else if (S1[i]==S2[i] && S1[i] - 'a' != j) {
                        mat[j][k]--;
                    }
                }
            }
        }
        int minDist = mat[0][0];
        for (vector<int> row : mat) {
            for (int item : row) {
                minDist = min(minDist, item);
            }
        }
        return minDist;
    }
};

因为小写字母很少,直接计算所有字符串的距离。mat[j][k]表示S1'和S2的距离,其中S1'为S1中j号小写字母变为k号小写字母得到的字符串。每一轮,除非j改为k之后对应字符串相同,或者没发生交换本来相同,否则都要距离++。