字符串距离计算(840479)题解

字符串距离计算

https://www.nowcoder.com/questionTerminal/82bd533cd9c34df29ba15bbf1591bedf

暴力解法:
枚举所有可能的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;
    }
全部评论

相关推荐

点赞 评论 收藏
转发
7 收藏 评论
分享
牛客网
牛客企业服务