Hướng dẫn reverse words in a string iii - leetcode solution python - đảo ngược các từ trong một chuỗi iii - leetcode Solution python

Hướng dẫn reverse words in a string iii - leetcode solution python - đảo ngược các từ trong một chuỗi iii - leetcode Solution python

Tiểu sử

Tuyên bố vấn đề này là một phần của thẻ tìm hiểu của LeetCode có tiêu đề Mảng và chuỗi. Theo kết luận tiêu đề phụ.

Báo cáo vấn đề

Đưa ra một chuỗi, bạn cần đảo ngược thứ tự của các ký tự trong mỗi từ trong một câu trong khi vẫn bảo tồn khoảng trống và thứ tự từ ban đầu.

ví dụ 1

Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

Lưu ý: Trong chuỗi, mỗi từ được phân tách bằng một không gian và sẽ không có bất kỳ khoảng trống nào trong chuỗi.

Phương pháp tiếp cận giải pháp 1
  1. Chuyển đổi toàn bộ chuỗi thành một danh sách. Chia chuỗi dựa trên khoảng trắng.
  2. Lặp lại trong danh sách. Đảo ngược từng từ. Để ngược lại bằng cách sử dụng cắt.
  3. Tái thiết toàn bộ chuỗi. Lần này mỗi từ sẽ được đảo ngược.

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.split()
        s1 = ''
        for x in range(0, len(s)):
            if x == len(s) - 1:
                s1 += s[x][::-1]
            else:
                s1 += s[x][::-1] + ' '
        return s1    

Những điều cần chú ý
  1. Chúng tôi đã sử dụng một vòng lặp để lặp lại danh sách qua. Độ phức tạp về thời gian - O (N).
  2. Chúng tôi đang đảo ngược chuỗi bằng cách cắt lát.
  3. Không gian thêm được sử dụng ở đây là tốt. Vì một chuỗi mới đang được xây dựng thay vì thực hiện các thay đổi tại chỗ.
Phương pháp tiếp cận giải pháp 2

Đây có lẽ là con đường dài hơn để đạt được giải pháp.

  1. Chia chuỗi thành từ. Tách bằng cách sử dụng khoảng trắng.
  2. Lặp lại trong danh sách. Chuyển đổi từng từ thành các chữ cái.
  3. Sau đó làm ngược lại dựa trên cách tiếp cận hai con trỏ. Một lần, ngược lại được thực hiện để tham gia các chữ cái đó để tạo thành chuỗi lại.
  4. Sau đó, một lần nữa chuyển đổi danh sách các từ được đảo ngược để tạo thành chuỗi đầu ra.

class Solution:
    def reverseWords(self, s: str) -> str:
        L = []
        string = s.split()
        for word in string:
            y = list(word)
            start = 0
            end = len(y) - 1
            while start < end:
                temp = y[start]
                y[start] = y[end]
                y[end] = temp
                start += 1
                end -= 1
            new_string = ''.join(y)
            L.append(new_string)
        return ' '.join(L)

Những điều cần chú ý
  1. Chúng tôi đã sử dụng một vòng lặp để lặp lại danh sách qua. Độ phức tạp về thời gian - O (N).
  2. Chúng tôi đang đảo ngược chuỗi bằng cách cắt lát.
  3. Không gian thêm được sử dụng ở đây là tốt. Vì một chuỗi mới đang được xây dựng thay vì thực hiện các thay đổi tại chỗ.
Phương pháp tiếp cận giải pháp 2
  1. Đây có lẽ là con đường dài hơn để đạt được giải pháp.
  2. Chia chuỗi thành từ. Tách bằng cách sử dụng khoảng trắng.
  3. Lặp lại trong danh sách. Chuyển đổi từng từ thành các chữ cái.

Sau đó làm ngược lại dựa trên cách tiếp cận hai con trỏ. Một lần, ngược lại được thực hiện để tham gia các chữ cái đó để tạo thành chuỗi lại.

Bạn vẫn có thể tạo một tài khoản và bật các tính năng như chế độ tối.dark mode.

Sự mô tả

Đưa ra một chuỗi, bạn cần đảo ngược thứ tự của các ký tự trong mỗi từ trong một câu trong khi vẫn bảo tồn khoảng trống và thứ tự từ ban đầu.

Ví dụ 1:

Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

Lưu ý: Trong chuỗi, mỗi từ được phân tách bằng một không gian và sẽ không có bất kỳ khoảng trống nào trong chuỗi.

Giải pháp đơn giản

Đối với một thử thách đơn giản, trước tiên tôi có xu hướng viết một giải pháp đơn giản nhưng đơn giản. Lặp lại tất cả các từ trong chuỗi đầu vào và đảo ngược từng từ.

class Solution {
public:
string reverse(string s) {
int l = 0;
int r = s.size() - 1;
while(l <= r)
swap(s[l++], s[r--]);
return s;
}
string reverseWords(string s) {
string ans = "";
string word = "";
int l = 0;
int r = 0;
while(l < s.size()) {
r = l;
word = "";

//try to find the end of a word
while(r < s.size() && s[r] != ' ')
word += s[r++];

//reverse the word, and append it to answer
if(word.size() > 0) {
ans += (ans.size() > 0 ? " " : "") + reverse(word);
}
while(s[r] == ' ') r++;
l = r;
}
return ans;
}
};

Tối ưu hóa: Chính sách tại chỗ

Đối với các ngôn ngữ lập trình như C/C ++, Ruby, PHP, Swift, mà chúng ta có thể sửa đổi chuỗi đầu vào. Chúng tôi có thể sử dụng chính sách tại chỗ để giảm các hướng dẫn sao chép thêm.

class Solution {
public:
string reverseWords(string s) {
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}

//reverse the word in-place!
int left = start, right = i - 1;
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}

//continue to skip whitespace
while (i < length && s[i] == ' ') {
i++;
}
}
return s;
}
};

Python

Bởi vì các chuỗi là bất biến trong Python, nên không khả thi khi đi qua chuỗi để trao đổi vị trí ký tự trong mỗi từ, nhưng với các lát cắt trong Python, chúng ta có thể thực hiện một triển khai thanh lịch hơn.

Ví dụ:

>>> line = "I love Python"
>>> line.split(" ")
['I', 'love', 'Python']
>>> line.split(" ")[::-1]
['Python', 'love', 'I']
>>> " ".join(line.split(" ")[::-1])
'Python love I'
>>> " ".join(line.split(" ")[::-1])[::-1]
'I evol nohtyP'

Vì vậy, giải pháp cho Python là:

class Solution(object):
def reverseWords(self, s):
return " ".join(s.split(" ")[::-1])[::-1]

Chuẩn bị cho một cuộc phỏng vấn? Kiểm tra điều này!

Tham gia danh sách email của tôi để biết thêm thông tin chi tiết, nó miễn phí! 😋