# [344. Reverse String](https://leetcode.com/problems/reverse-string/description/?envType=daily-question&envId=2024-06-02) # 1. Tóm tắt đề bài Hãy viết một hàm `reverseString` nhận vào một mảng ký tự `s` và đảo ngược nó [tại chỗ](https://en.wikipedia.org/wiki/In-place_algorithm) với độ phức tạp bộ nhớ $O(1)$. ### Giới hạn - $n =$ `s.length` - $1 \le n \le 10^5$ - `s[i]` là [ký tự ASCII in được](https://vi.wikipedia.org/wiki/ASCII#K%C3%BD_t%E1%BB%B1_ASCII_in_%C4%91%C6%B0%E1%BB%A3c) # 2. Tóm tắt lời giải **Độ phức tạp dự tính: $O(n)$** > "Đời người thật ngắn ngủi, hãy dùng Python." - Một ai đó > ```python > def reverseString(self, s: List[str]) -> None: > s.reverse() > ``` Bỏ qua các rào cản về ngôn ngữ lập trình, thấy có xuất hiện **mảng**, **tại chỗ** và **bộ nhớ** $O(1)$ là ta nghĩ ngay đến vận dụng hai con trỏ. # 3. Lời giải chi tiết Khởi tạo hai con trỏ `left` trỏ đầu mảng, và `right` trỏ cuối mảng. Ta từng bước swap ký tự tại `left` và `right` với nhau, sau đó tịnh tiến hai con trỏ dần đến giữa mảng, cho đến khi chúng trỏ về cùng một vị trí (`s.length` lẻ) hoặc vượt qua nhau (`s.length` chẵn). ![060210452201](https://hackmd.io/_uploads/BkCZoDKNC.png) ### [Code mẫu](https://leetcode.com/problems/reverse-string/submissions/1274803841?envType=daily-question&envId=2024-06-02) ### Độ phức tạp thuật toán Thời gian: $O(\frac{n}{2}) = O(n)$ Bộ nhớ mở rộng: $O(1)$ # 4. Kết luận & Gợi ý mở rộng Hình như đầu tháng nên 2 bài cuối tuần nay nhắm mắt cũng làm được :sweat_smile: Một số bài mở rộng: - [541. Reverse String II](https://leetcode.com/problems/reverse-string-ii/description/) - [345. Reverse Vowels of a String](https://leetcode.com/problems/reverse-vowels-of-a-string/) - [151. Reverse Words in a String](https://leetcode.com/problems/reverse-words-in-a-string/)