LeetCode 151 Đảo ngược các từ trong chuỗi - truc tiep socolive

| Feb 17, 2025 min read

27 tháng 10 năm 2019 - Máy tính

1. Mô tả bài toán

Cho một chuỗi, hãy đảo ngược thứ tự các từ trong chuỗi đó theo trình tự từ phải qua trái.

Lưu ý: a) Một từ được định nghĩa là một chuỗi ký tự không chứa khoảng trắng và liên tục. b) Chuỗi đầu vào có thể có khoảng trắng ở đầu hoặc cuối, nhưng chuỗi kết quả sau khi đảo ngược sẽ không được phép có khoảng trắng ở đầu hoặc cuối. c) Các khoảng trắng dư thừa giữa các từ trong chuỗi gốc cần được loại bỏ chỉ còn lại một khoảng trắng duy nhất giữa các từ.

Ví dụ 1:

Đầu vào: "the sky is blue"
Đầu ra: "blue is sky the"

Ví dụ 2:

Đầu vào: " hello world! "
Đầu ra: "world! hello"
Giải thích: Kết quả sau khi đảo ngược không nên có khoảng trắng ở đầu hoặc cuối chuỗi.

Ví dụ 3:

Đầu vào: "a good example"
Đầu ra: "example good a"
Giải thích: Khi đảo ngược, cần giảm bớt các khoảng trắng dư thừa giữa các từ thành một khoảng trắng duy nhất.

Nguồn iwin68.club phiên bản mới bài toán: LeetCode

2. Cách tiếp cận giải quyết

Khởi tạo biến lastIndex để lưu trữ vị trí 2233win của ký tự cuối cùng trong từ hiện tại đang duyệt đến.

Duyệt cwin 667 chuỗi từ cuối về đầu với mỗi ký tự tại vị trí i:

a) Nếu ký tự tại vị trí i là khoảng trắng:

  • Kiểm tra xem i có bằng với lastIndex hay không. Nếu bằng nhau, di chuyển cả lastIndex lẫn i về phía trước một bước.
  • Nếu không bằng, nối thêm từ (từ vị trí i+1 đến lastIndex+1) kèm theo một khoảng trắng vào kết quả, sau đó đặt lại giá trị của lastIndex thành i-1.

b) Nếu ký tự tại vị trí i không phải là khoảng trắng:

  • Kiểm tra xem đã đạt tới đầu chuỗi chưa. Nếu đạt tới đầu chuỗi và i <= lastIndex, nối thêm từ cuối cùng vào kết quả.

Cuối cùng, sử dụng phương thức trim để loại bỏ khoảng trắng thừa ở cuối chuỗi và trả về kết quả.

3. Mã nguồn thực hiện bằng Golang

func reverseWords(s string) string {
    reversed := ""
    lastIndex := len(s) - 1
    for i := len(s) - 1; i >= 0; i-- {
        if ' ' == s[i] {
            if i == lastIndex {
                lastIndex--
            } else {
                reversed += s[i+1:lastIndex+1] + " "
                lastIndex = i - 1
            }
        } else {
            if 0 == i && i <= lastIndex {
                reversed += s[i : lastIndex+1]
            }
        }
    }
    if len(reversed) > 1 && ' ' == reversed[len(reversed)-1] {
        reversed = reversed[:len(reversed)-1]
    }
    return reversed
}

#Golang #ThuậtToán