记录一次简单的优化 力扣 1790. 仅执行一次字符串交换能否使两个字符串相等

题目: https://leetcode-cn.com/problems/check-if-one-string-swap-can-make-strings-equal/
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

第一次解题的答案:

public boolean areAlmostEqual(String s1, String s2) {
        if (s1.equals(s2)) {
            return true;
        }

        // 长度不相等,直接返回false
        if (s1.length() != s2.length()) {
            return false;
        }

        // 找出所有不相等值的下标
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                list.add(i);
            }
        }

        // 多于或者少于2处,交换之后都不会相等,直接返回false
        if (list.size() != 2) {
            return false;
        }

        // 只有两处不同,则判断值是否相等
        return s1.charAt(list.get(0)) == s2.charAt(list.get(1)) && s1.charAt(list.get(1)) == s2.charAt(list.get(0));

    }

通过,但是不理想

后来发现代码有可以优化的地方,比如既然知道了最多只有2处不同才有可能通过一次交换相等,修改代码,重新提交:
提交结果如下(修改后的代码在下面):

 public boolean areAlmostEqual(String s1, String s2) {
        if (s1.equals(s2)) {
            return true;
        }

        // 长度不相等,直接返回false
        if (s1.length() != s2.length()) {
            return false;
        }

        // 找出所有不相等值的下标
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                list.add(i);
            }
            // 多于2处,交换之后都不会相等,直接返回false
            if (list.size() > 2) {
                return false;
            }
        }

        // 等于1处,,直接返回false
        if (list.size() == 1) {
            return false;
        }

        // 只有两处不同,则判断值是否相等
        return s1.charAt(list.get(0)) == s2.charAt(list.get(1)) && s1.charAt(list.get(1)) == s2.charAt(list.get(0));
    
    }
posted @ 2022-03-13 00:15  lick  阅读(96)  评论(0编辑  收藏  举报