likes
comments
collection
share

Java&C++题解与拓展——leetcode1790.仅执行一次字符串交换能否使两个字符串相等【么的新知识】

作者站长头像
站长
· 阅读数 12
每日一题做题记录,参考官方和三叶的题解

题目要求

Java&C++题解与拓展——leetcode1790.仅执行一次字符串交换能否使两个字符串相等【么的新知识】

Java&C++题解与拓展——leetcode1790.仅执行一次字符串交换能否使两个字符串相等【么的新知识】

思路:模拟

  • 用两个变量记录不同位置得下标,分情况讨论即可:
    • 遍历两个字符串,不同的位置超过两个直接false
    • 若全相同【a=−1a=-1a=1】直接true
    • 若只有一个位置不同【a≠−1,b=−1a\ne -1,b=-1a=1,b=1】,则false
    • 若不同的位置刚好两个,且其对应字符交叉相同【s1[a]=s2[b],s1[b]=s2[a]s1[a]=s2[b],s1[b]=s2[a]s1[a]=s2[b],s1[b]=s2[a]】,则true

Java

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
        if (s1.length() != s2.length())
            return false;
        int a = -1, b = -1;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) == s2.charAt(i))
                continue;
            if (a == -1)
                a = i; // 第一个不同
            else if (b == -1)
                b = i; // 第二个不同
            else
                return false; // 两个以上不相同
        }
        if (a == -1) // 全相同
            return true;
        if (a != -1 && b == -1) // 一个不同
            return false;
        return s1.charAt(a) == s2.charAt(b) && s1.charAt(b) == s2.charAt(a); // 不同位置字符相同
    }
}
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)

C++

class Solution {
public:
    bool areAlmostEqual(string s1, string s2) {
        if (s1.size() != s2.size())
            return false;
        int a = -1, b = -1;
        for (int i = 0; i < s1.size(); i++) {
            if (s1[i] == s2[i])
                continue;
            if (a == -1)
                a = i; // 第一个不同
            else if (b == -1)
                b = i; // 第二个不同
            else
                return false; // 两个以上不相同
        }
        if (a == -1) // 全相同
            return true;
        if (a != -1 && b == -1) // 一个不同
            return false;
        return s1[a] == s2[b] && s1[b] == s2[a]; // 不同位置字符相同
    }
};
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)

Rust

  • 记得要把字符串改成可操作的……
impl Solution {
    pub fn are_almost_equal(s1: String, s2: String) -> bool {
        if (s1.len() != s2.len()) {
            return false;
        }
        let n = s1.len();
        let (mut a, mut b) = (n, n);
        let (s1, s2) = (s1.as_bytes(), s2.as_bytes());
        for i in 0..n {
            if s1[i] == s2[i] {
                continue;
            }
            if a == n {
                a = i; // 第一个不同
            }
            else if b == n {
                b = i; // 第二个不同
            }
            else {
                return false; // 两个以上不相同
            }
        }
        if a == n { // 全相同
            return true;
        }
        if a != n && b == n { // 一个不同
            return false;
        }
        s1[a] == s2[b] && s1[b] == s2[a] // 不同位置字符相同
    }
}
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)

总结

简单模拟题~冷静分析每种条件就好啦

欢迎指正与讨论!