carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode859:亲密字符串(buddy-strings) #149

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题分析

给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。  

示例 1:

输入:s = "ab", goal = "ba" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。 示例 2:

输入:s = "ab", goal = "ab" 输出:false 解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。 示例 3:

输入:s = "aa", goal = "aa" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。   提示:

1 <= s.length, goal.length <= 2 * 104 s 和 goal 由小写英文字母组成

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/buddy-strings

carloscn commented 1 year ago

问题分析

字符串长度不相等, 直接返回false 字符串相等的时候, 只要有重复的元素就返回true A, B字符串有不相等的两个地方, 需要查看它们交换后是否相等即可.

fn is_buddy_string(a:&String, b:&String) -> bool
{
    let mut a_s:Vec<char> = String::from(a).chars().collect();
    let mut b_s:Vec<char> = String::from(b).chars().collect();
    let mut an:Vec<char> = vec![];
    let mut bn:Vec<char> = vec![];
    let mut i:usize = 0;

    if a_s.len() != b_s.len() {
        return false;
    }

    if a_s == b_s {
        for e in &a_s {
            if utils::str::is_contains_repeat_element(a, *e) {
                return true;
            }
        }
    }

    while i < a_s.len() {
        if a_s[i] != b_s[i] {
            an.push(a_s[i]);
            bn.push(b_s[i]);
        }
        i += 1;
    }

    if an.len() == 0 || bn.len() == 0{
        return false;
    }

    an.sort();
    bn.sort();

    return an == bn;
}
carloscn commented 1 year ago

code

https://review.gerrithub.io/c/carloscn/structstudy/+/551092 https://github.com/carloscn/structstudy/commit/c11c4489ec198f5e1dfb5c1a5100a444216f3ed9