1737. 满足三条件之一需改变的最少字符数

104 阅读1分钟

条件1:a中的元素均小于b中的元素:将 a中[i]位置之后 的元素全部改为 [i]位置及之前 的字符,并将 b中[i]位置及之前 的元素全部改为 [i]位置之后 的字符。此时,所需操作数为: len(a) - sum(A[i + 1]) + sum(B[i + 1])

条件2:b中的元素均小于a中的元素(同上,反过来算即可):将 a中[i]位置及之前 的元素全部改为 [i]位置之后 的字符,并将 b中[i]位置之后 的元素全部改为 [i]位置及之前 的字符 此时,所需操作数为: sum(A[i + 1]) + len(b) - sum(B[i + 1]);

条件3:a和b中的元素相同:将a中的元素全部变成 a中[i]位置 的元素,将b中的元素全部变成 b中[i]位置 的元素。此时,所需操作为:(len(a) - A[i]) + (len(b) - B[i]) 。

class Solution {
public:
    int minCharacters(string a, string b) {
        int n = a.size(), m = b.size();
        vector<int> stra(26, 0), strb(26, 0);
        for(auto c : a) stra[c - 'a'] ++;
        for(auto c : b) strb[c - 'a'] ++;

        int res = INT_MAX;
        int presum1  = 0, presum2 = 0;
        for(int i = 0; i < 25; i ++) {//遍历前25个字母,以位置i的字母为据点
            presum1 += stra[i];
            presum2 += strb[i];
            res = min(min(res, n - presum1 + presum2), min(m - presum2 + presum1, n - stra[i] + m - strb[i]));
        }

        res = min(res, n - stra[25] + m - strb[25]);//对于 位置[i=25],即表示字母'z',
        //不存在比'z'更大的字符, 因此,若字符串a或b中存在'z',条件1-2不再判断,只需判断条件3:
        //此时,a和b中所有字符变为'z',需要的操作次数为:n1-A[i] + n2-B[i], i=25

        return res;
    }
};