算法小知识-----10.11----- 仅执行一次字符串交换能否使两个字符串相等

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

这周的第二天了,家人们,距离周末已经不久了,大家准备准备嘿嘿嘿

仅执行一次字符串交换能否使两个字符串相等

该题出自力扣的1790题 —— 使序列递增的最小交换次数【简单题】

审题

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

  • 这道题虽然是简单题,但是也还是错了几次的,因为边界的判断和一些经验的缺少
  • 题意就是给出两个字符串,长度是一致的,如果仅仅因为两个字符的位置交换就可以替换成另一个字符的话,那么就可以返回true,否则的话,超过1个以上的转换次数就返回false
  • 利用三个变量
    • num:记录字符差异次数,如果true的话,必定只能有两个差异
    • 记录首个差异的下标
    • 记录第二个差异的下标
  • 先进行剪枝动作,如果两个字符串相等的话,那么直接返回true
  • 遍历字符串长度,判断如果当前字符不相等,那么差异加一,如果差异超过2,那么证明两个字符串必定不能转换后相等
  • 最后遍历结束,进行二次判断,如果只存在一个差异。例如 "aa"和"ac"这种用例,就只有一个差异值
  • 判断首个差异与第二个差异肯定就是对应的是s1字符串和s2字符串的换转
  • 最后返回false作为兜底。

编码

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
       if (s1.equals(s2))return true;
       int num = 0,f= -1,s = -1;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)){
                num++;
                if (num > 2){
                    return false;
                }
                if (num == 1) {
                    f = i;
                }else {
                    s = i;
                }
            }
        }
        if (f != -1 && s != -1){
            if (s1.charAt(f) == s2.charAt(s) && s1.charAt(s) == s2.charAt(f)) {
                return true;
            }
        }
        return false;
    }
}

image.png