Giả sử chúng ta có hai chuỗi 'a' và 'b' và một chuỗi 'hợp nhất'. Nhiệm vụ là điền vào chuỗi 'hợp nhất' với các ký tự từ 'a' và 'b' theo cách sao cho
- Nếu chuỗi 'a' không trống, thì hãy xóa ký tự đầu tiên khỏi chuỗi 'a' và sao chép nó vào chuỗi 'merge'.
- Nếu chuỗi 'b' không trống, thì hãy xóa ký tự đầu tiên khỏi chuỗi 'b' và sao chép nó vào chuỗi 'merge'.
- Nếu các chuỗi 'a' và 'b' không trống, thì hãy xóa các ký tự đầu tiên khỏi chuỗi 'a' và sao chép nó vào chuỗi 'merge' rồi xóa ký tự đầu tiên (nếu có) khỏi chuỗi 'b 'và sao chép nó vào chuỗi' hợp nhất '.
- Xóa các ký tự khỏi cả hai chuỗi về mặt từ vựng, có nghĩa là, nếu chuỗi 'a' lớn hơn chuỗi 'b', thì hãy xóa ký tự khỏi chuỗi 'a' rồi đến chuỗi 'b'.
- Trả về chuỗi 'hợp nhất'.
Ví dụ
Đầu vào-1:
a = “bacaa”b = “abcaa”
Đầu ra:
babcacaaaa
Giải thích:
Vì chuỗi đã cho 'a' lớn hơn về mặt từ vựng so với chuỗi 'b', chúng tôi sẽ trích xuất ký tự đầu tiên từ chuỗi 'a', tức là, "b" và sau đó từ chuỗi 'b'. Sau khi giải nén, chuỗi sẽ là “babcacaaaa”.
Phương pháp tiếp cận để giải quyết vấn đề này
Cách tiếp cận đệ quy để giải quyết vấn đề này là chúng tôi sẽ trích xuất từng ký tự của chuỗi 'a' và chuỗi 'b' và sẽ kiểm tra xem các ký tự của chuỗi 'a' có lớn hơn về mặt từ vựng hay không và cuối cùng nối thành chuỗi 'merge' .
Chúng tôi sẽ tìm chuỗi con của mỗi ký tự sau một số vị trí và nối thành 'hợp nhất' nếu nó lớn hơn về mặt từ vựng so với chuỗi kia.
- Lấy hai chuỗi đầu vào 'a' và 'b'.
- Một hàm chuỗi đệ quy concatenateLargest (chuỗi a, chuỗi b) nhận hai chuỗi làm đầu vào và trả về chuỗi lớn nhất sau khi ghép, tức là (chuỗi 'a' + chuỗi 'b').
- Nếu cả hai chuỗi đều trống, thì trả về chuỗi 'a' + chuỗi 'b'.
- Nếu chuỗi 'a' nhỏ hơn hoặc bằng chuỗi 'b', hãy trích xuất ký tự đầu tiên và gọi hàm đệ quy cho các ký tự khác.
- Nếu chuỗi 'b' nhỏ hơn hoặc bằng chuỗi 'b', hãy trích xuất ký tự đầu tiên và gọi hàm đệ quy cho các ký tự khác.
- Trả về chuỗi đã nối.
Ví dụ
#include <bits/stdc++.h> using namespace std; string concatenateLargest(string a, string b) { if (a.size() == 0 or b.size() == 0) { return (a + b); } if (a <= b) return b[0] + concatenateLargest(a, b.substr(1)); else return a[0] + concatenateLargest(a.substr(1), b); } int main() { string a = "bacaa"; string b = "abcaa"; cout << concatenateLargest(a, b) << endl; return 0; }
Chạy đoạn mã trên sẽ tạo ra kết quả là,
Đầu ra
bacabcaaaa
Hai chuỗi “bacaa” và “abcaa” sẽ trở thành “bacabcaaaa” sau khi hợp nhất theo bài toán đã cho.