859. Buddy Strings

LeetCode easy original: C# #array #csharp #easy #leetcode #string
Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

given две строки s и goal. return true, если вы можете поменять местами две буквы в s так, чтобы результат был равен goal, в противном случае return false.

Обмен буквами определяется как взятие двух индексов i и j (нумерация с 0), таких что i != j, и обмен символов в s[i] и s[j].

НаVí dụ, обмен символов на индексах 0 и 2 в строке "abcd" приводит к "cbad".

Ví dụ:

Input: s = "ab", goal = "ba"

Output: true

Explanation: You can swap s[0] = 'a' and s[1] = 'b' to get "ba", which is equal to goal.

C# lời giải

đã khớp/gốc
public class Solution {
    public bool BuddyStrings(string s, string goal) {
        if (s.Length != goal.Length) return false;
        if (s == goal) {
            var freq = new int[26];
            foreach (var ch in s) {
                if (++freq[ch - 'a'] > 1) return true;
            }
            return false;
        }
        int firstIndex = -1, secondIndex = -1;
        for (int i = 0; i < s.Length; ++i) {
            if (s[i] != goal[i]) {
                if (firstIndex == -1) firstIndex = i;
                else if (secondIndex == -1) secondIndex = i;
                else return false;
            }
        }
        return secondIndex != -1 &&
               s[firstIndex] == goal[secondIndex] &&
               s[secondIndex] == goal[firstIndex];
    }
}

C++ lời giải

bản nháp tự động, xem lại trước khi gửi
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public bool BuddyStrings(string s, string goal) {
        if (s.size() != goal.size()) return false;
        if (s == goal) {
            var freq = new int[26];
            foreach (var ch in s) {
                if (++freq[ch - 'a'] > 1) return true;
            }
            return false;
        }
        int firstIndex = -1, secondIndex = -1;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] != goal[i]) {
                if (firstIndex == -1) firstIndex = i;
                else if (secondIndex == -1) secondIndex = i;
                else return false;
            }
        }
        return secondIndex != -1 &&
               s[firstIndex] == goal[secondIndex] &&
               s[secondIndex] == goal[firstIndex];
    }
}

Java lời giải

đã khớp/gốc
class Solution {
    public boolean buddyStrings(String s, String goal) {
        if (s.length() != goal.length()) return false;
        if (s.equals(goal)) {
            int[] freq = new int[26];
            for (char ch : s.toCharArray()) {
                if (++freq[ch - 'a'] > 1) return true;
            }
            return false;
        }

        int firstIndex = -1, secondIndex = -1;
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) != goal.charAt(i)) {
                if (firstIndex == -1) firstIndex = i;
                else if (secondIndex == -1) secondIndex = i;
                else return false;
            }
        }

        return secondIndex != -1 &&
               s.charAt(firstIndex) == goal.charAt(secondIndex) &&
               s.charAt(secondIndex) == goal.charAt(firstIndex);
    }
}

JavaScript lời giải

đã khớp/gốc
var buddyStrings = function(s, goal) {
    if (s.length !== goal.length) return false;
    if (s === goal) {
        const freq = new Map();
        for (const ch of s) {
            if (freq.has(ch)) return true;
            freq.set(ch, 1);
        }
        return false;
    }

    let firstIndex = -1, secondIndex = -1;
    for (let i = 0; i < s.length; ++i) {
        if (s[i] !== goal[i]) {
            if (firstIndex === -1) firstIndex = i;
            else if (secondIndex === -1) secondIndex = i;
            else return false;
        }
    }

    return secondIndex !== -1 &&
           s[firstIndex] === goal[secondIndex] &&
           s[secondIndex] === goal[firstIndex];
};

Python lời giải

đã khớp/gốc
class Solution:
    def buddyStrings(self, s: str, goal: str) -> bool:
        if len(s) != len(goal):
            return False
        if s == goal:
            freq = {}
            for ch in s:
                if ch in freq:
                    return True
                freq[ch] = 1
            return False

        firstIndex = -1
        secondIndex = -1
        for i in range(len(s)):
            if s[i] != goal[i]:
                if firstIndex == -1:
                    firstIndex = i
                elif secondIndex == -1:
                    secondIndex = i
                else:
                    return False

        return secondIndex != -1 and \
               s[firstIndex] == goal[secondIndex] and \
               s[secondIndex] == goal[firstIndex]

Go lời giải

đã khớp/gốc
func buddyStrings(s string, goal string) bool {
    if len(s) != len(goal) {
        return false
    }
    if s == goal {
        freq := make(map[rune]int)
        for _, ch := range s {
            freq[ch]++
            if freq[ch] > 1 {
                return true
            }
        }
        return false
    }

    firstIndex, secondIndex := -1, -1
    for i := range s {
        if s[i] != goal[i] {
            if firstIndex == -1 {
                firstIndex = i
            } else if secondIndex == -1 {
                secondIndex = i
            } else {
                return false
            }
        }
    }

    return secondIndex != -1 &&
           s[firstIndex] == goal[secondIndex] &&
           s[secondIndex] == goal[firstIndex]
}

Algorithm

Если количество символов в chuỗiх s и goal разное, возвращаем false. Если s == goal, используем хеш-таблицу или mảng из 26 elementов для хранения частоты каждого символа в строке s. Если какой-либо символ встречается более одного раза, можно поменять местами две одинаковые буквы, возвращаем true. Иначе возвращаем false.

Иначе, если s != goal, инициализируем firstIndex и secondIndex значениями -1 для хранения индексов символов в строке s, которые отличаются от символов в строке goal на тех же индексах. Итерируем по каждому индексу i в строке s: если символы s[i] и goal[i] разные, сохраняем текущий индекс. Если firstIndex == -1, обновляем firstIndex = i. Если firstIndex != -1, но secondIndex == -1, обновляем secondIndex = i. Если оба индекса уже обновлены, возвращаем false.

Если обновлен только firstIndex, возвращаем false. Иначе, все символы обеих строк одинаковы, кроме двух индексов. Поэтому s[firstIndex] должен быть равен goal[secondIndex], и s[secondIndex] должен быть равен goal[firstIndex], чтобы строки стали равны после обмена.

😎

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.