题目:
给定两个长度相等的,由小写字母组成的字符串S1和S2,定义S1和S2的距离为两个字符串有多少个位置上的字母不相等。
现在牛牛可以选定两个字母X1和X2,将S1中的所有字母X1均替换成X2。(X1和X2可以相同)
牛牛希望知道执行一次替换之后,两个字符串的距离最少为多少。

方法一:暴力解法
可以是也可以是,所以直接枚举,遍历,先替换,再判断是否相等,不相等则,否则不变,每一轮对替换完后更新min

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算最少的距离
     * @param S1 string字符串 第一个字符串
     * @param S2 string字符串 第二个字符串
     * @return int整型
     */
    public int GetMinDistance (String S1, String S2) {
        // write code here
        //S1的
        int ans=(int)Math.pow(10,5);
        //枚举x1,x2
        for(char x1='a';x1<'z';x1++){
            for(char x2='a';x2<'z';x2++){
                int dist=0;
                for(int i=0;i<S1.length();i++){
                   char cur= S1.charAt(i)==x1?x2:S1.charAt(i);//将x1换为x2或者它本身不变
                   dist=cur!=S2.charAt(i)?dist+1:dist;//S1第i个位置的字符与S2第i个位置的字符不相同时距离+1,否则不变
                }
                ans=Math.min(ans,dist);//取最小值
            }
        }return ans;
    }
}

复杂度:
时间复杂度:第一层循环26次,第二层循环26次,第三层循环n次(n为S1的长度),则空间复杂度为;
空间复杂度:没有使用额外的存储空间,空间复杂度为
方法二:
方法一是在枚举的过程中替换,需要三重循环,优化后的方法是先计算未替换为时的距离,通过cnt二维数组存储所有替换方法的减少距离数,具体方法是对进行统计,如果S1中有n个,S2对应位置有n个,则n个都可以被替换为相同的,所以累计n次,表示这一种替换方法可以减少的距离数为n,每种替换方法下的最终距离(当不相等时,为0,则相当于减去,如果相等,则原本不相等的位置已经被统计为,,则减去0,不变)
最后,再遍历cnt数组,求得距离最小值
图片说明

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算最少的距离
     * @param S1 string字符串 第一个字符串
     * @param S2 string字符串 第二个字符串
     * @return int整型
     */
    public int GetMinDistance (String S1, String S2) {
        // write code here
        //S1的
        int[][]cnt=new int[26][26];
        int dist=0;
        for(int i=0;i<S1.length();i++){
            char x1=S1.charAt(i);
            char x2=S2.charAt(i);
            cnt[x1-'a'][x2-'a']++;//假如S1有n个x1,S2对应位置有n个x2,则n个x1都可以被替换为相同的x2所以cnt[x1-'a'][x2-'a']会累加到n
            if(x1!=x2)
                dist++;//记录x1未替换为x2时的距离
        }
        int res=Integer.MAX_VALUE;
        //枚举x1,x2的可能情况
        for(int i=0;i<26;i++){
            for(int j=0;j<26;j++){
                //遍历矩阵,找到距离的最小值
                res=Math.min(res,dist+cnt[i][i]-cnt[i][j]);//替换后减少的距离
            }
        }
        return res;
    }
}

复杂度:
时间复杂度:需要遍历一次字符串,时间复杂度为(n为字符串的长度)
空间复杂度:额外使用的cnt数组大小为26*26,常数级空间,所以空间复杂度为