Giả sử có một chuỗi đầu vào câu nơi mỗi phần tử lưu dưới dạng ký tự đơn lẻ, ta phải đảo ngược chuỗi theo từng từ.
Vì vậy, nếu đầu vào là ["t","h","e"," ","m","a","n"," ","i","s"," ","n","i","c","e"], thì đầu ra sẽ là ["n","i","c","e"," ","i","s"," ","m","a","n"," ","t","h","e"].
Để giải quyết, ta làm theo các bước sau:
- đảo ngược toàn bộ mảng s
- j := 0
- n := kích thước s
- với i := 0, khi i < n, tăng i 1, làm:
- nếu s[i] là ' ', thì đảo ngược mảng s từ chỉ số j đến i, j := i + 1
- đảo ngược mảng s từ chỉ số j đến n
Hãy xem triển khai sau để hiểu rõ hơn:
Ví dụ
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v) {
cout << "[";
for(int i = 0; i < v.size(); i++) {
cout << v[i] << ", ";
}
cout << "]" << endl;
}
class Solution {
public:
void reverseWords(vector<char>& s) {
reverse(s.begin(), s.end());
int j = 0;
int n = s.size();
for(int i = 0; i < n; i++) {
if(s[i] == ' ') {
reverse(s.begin() + j, s.begin() + i);
j = i + 1;
}
}
reverse(s.begin() + j, s.begin() + n);
}
};
int main() {
Solution ob;
vector<char> v = {'t','h','e',' ','m','a','n',' ','i','s',' ','n','i','c','e'};
ob.reverseWords(v);
print_vector(v);
return 0;
}
Đầu vào
{'t','h','e',' ','m','a','n',' ','i','s',' ','n','i','c','e'}
Đầu ra
[n, i, c, e, , i, s, , m, a, n, , t, h, e, ]