Tạo dấu ngoặc đơn Python

Đây là một phần của loạt bài giải thích giải pháp Leetcode [chỉ mục]. Nếu bạn thích giải pháp này hoặc thấy nó hữu ích, vui lòng thích bài đăng này và/hoặc bình chọn cho bài đăng giải pháp của tôi trên diễn đàn của Leetcode

Bài toán Leetcode #22 [Trung bình]. Tạo dấu ngoặc đơn

Sự mô tả


[Chuyển đến. Ý tưởng giải pháp. Mã số. JavaScript. con trăn. Java. C++]

Cho trước

{{}}
{}{}
4 cặp dấu ngoặc đơn, hãy viết một hàm để tạo tất cả các tổ hợp dấu ngoặc đơn được định dạng tốt

ví dụ

ví dụ 1. Đầu vào. n = 3Đầu ra. ["[[[]]]","[[][]]","[[]][]","[][[]]","[][][]"]

ví dụ 2. Đầu vào. n = 1Đầu ra. ["[]"]

Hạn chế

  • {{}}
    {}{}
    5

Ý kiến


[Chuyển đến. Mô tả vấn đề. Mã số. JavaScript. con trăn. Java. C++]

Chúng ta có thể giải quyết vấn đề này một cách ngắn gọn bằng hàm đệ quy phân nhánh cơ bản [dfs]. Hàm đệ quy của chúng tôi sẽ lặp qua các vị trí chỉ mục [vị trí] của một kết quả có thể. Tại mỗi vị trí, chúng ta có thể thêm dấu ngoặc đơn mở nếu còn nhiều khoảng trống hơn dấu ngoặc đơn không đóng [mở] và chúng ta có thể thêm dấu ngoặc đơn đóng nếu có bất kỳ dấu ngoặc đơn nào chưa đóng. Khi chúng tôi đạt đến cuối kết quả, chúng tôi có thể thêm nó vào mảng câu trả lời của mình [ans]

Để làm cho mọi thứ dễ dàng hơn, chúng ta có thể sử dụng thao tác bit để chuyển chuỗi dấu ngoặc đơn [seq] cho kết quả tiềm năng của chúng ta dưới dạng số nguyên cho mỗi cấp độ đệ quy mới. Sau đó, chúng ta chỉ cần dịch seq thành chuỗi ngoặc đơn trước khi thêm nó vào ans

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh Git chấp nhận cả tên thẻ và tên nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi không mong muốn. Bạn có chắc chắn muốn tạo nhánh này không?

Cho n cặp dấu ngoặc đơn, hãy viết hàm tạo tất cả các tổ hợp dấu ngoặc đơn hợp lệ

Ví dụ, cho trước n = 3, một tập nghiệm là

[
"[[[]]]",
"[[][]]",
"[[]][]",
"[][[]]",
"[][][]"
]

Cách tiếp cận. đệ quy

Sau khi đọc câu hỏi này, điều đầu tiên tôi nghĩ đến là - làm cách nào để tạo từng chuỗi?

Lấy mục đầu tiên trong mảng trên làm ví dụ — “[[[]]]”. Quá trình quyết định sẽ như sau

Quyết định 1. nối thêm '[' - Chuỗi hiện tại. '['

Quyết định 2. nối thêm '[' - Chuỗi hiện tại. '[['

… [bạn hiểu ý]…

Quyết định 5. nối thêm ']' - Chuỗi hiện tại. ‘[[[]]’

Quyết định 6. nối thêm ']' - Chuỗi hiện tại. ‘[[[]]]’

Sau khi nhận ra rằng mỗi chuỗi có thể được tạo chỉ từ 2 quyết định, điều tiếp theo cần tìm ra là - Làm cách nào để tạo tất cả các kết hợp hợp lệ?

Đối với điều này, chúng ta cần nhận ra 2 hạn chế do sự báo trước của 'hình thức tốt'

  1. Tổng số CP [dấu ngoặc đơn đóng] bạn còn lại để thêm vào bất kỳ thời điểm nào không được nhỏ hơn số lượng OP [dấu ngoặc đơn mở] có sẵn. cho e. g. ‘[[]]]’ , ‘]’, ‘[]]’ không hợp lệ vì lý do này
  2. Khi còn 0 OP để sử dụng, bạn chỉ có thể đưa ra 1 quyết định — nối thêm CP

Với điều này trong tâm trí, đây là mã

Như bạn có thể thấy, 'gen' đại diện cho hàm đệ quy. Nó nhận 3 thông số

o - tổng số không. của OP còn lại có sẵn để nối thêm

c — tổng số không. của CP còn lại có sẵn để nối thêm

s - chuỗi hiện được xây dựng

câu lệnh điều kiện đầu tiên — nếu o > c. Ngăn chặn giới hạn 1 xảy ra. Nếu điều này xảy ra, hàm sẽ đơn giản ngừng gọi chính nó theo cách đệ quy

câu lệnh điều kiện thứ 2 — nếu o==0 và c ==0. Sự kiện trong đó kết hợp hợp lệ được hình thành với n OP và CP được chỉ định. Khi điều này xảy ra, chuỗi đã xây dựng được thêm vào mảng ans

câu lệnh điều kiện thứ 3 — if o == 0. khác. , phần này của hàm đệ quy xác định cách tiếp tục với các lời gọi đệ quy. Trong trường hợp OP bằng 0 [i. e. không còn OP để nối thêm], cuộc gọi duy nhất cần thực hiện [giới hạn 2], là nối thêm CP. Sau đó, hàm này giảm số lượng CP còn lại đi 1 và nối thêm ']' vào chuỗi s hiện có. Mặt khác, cả hai quyết định đều được đưa ra — quyết định nối thêm '[' và ']'

Tôi thực sự hy vọng ai đó thấy điều này hữu ích theo cách này hay cách khác. Đây có lẽ không phải là cách tiếp cận rõ ràng nhất [mã khôn ngoan] cho câu hỏi này nhưng ý tưởng là có. Vui lòng để lại bình luận nếu có bất cứ điều gì cần làm rõ

{{}}
{}{}
32
{{}}
{}{}
33
{{}}
{}{}
1
{{}}
{}{}
35
{{}}
{}{}
1
{{}}
{}{}
37
{{}}
{}{}
1
{{}}
{}{}
39
{{}}
{}{}
1
{{}}
{}{}
41

 

{{}}
{}{}
42

{{}}
{}{}
32
{{}}
{}{}
44
{{}}
{}{}
1
{{}}
{}{}
2

{{}}
{}{}
3

{{}}
{}{}
4
{{}}
{}{}
9
{{}}
{}{}
50

{{}}
{}{}
01____152

{{}}
{}{}
4
{{}}
{}{}
06____469

{{}}
{}{}
09

 

{{}}
{}{}
32
{{}}
{}{}
33
{{}}
{}{}
1
{{}}
{}{}
35
{{}}
{}{}
1
{{}}
{}{}
37
{{}}
{}{}
1
{{}}
{}{}
39
{{}}
{}{}
1
{{}}
{}{}
66

{{}}
{}{}
3

{{}}
{}{}
4
{{}}
{}{}
69
{{}}
{}{}
056
{{}}
{}{}
32
{{}}
{}{}
727
{{}}
{}{}
1
{{}}
{}{}
37
{{}}
{}{}
1
{{}}
{}{}
39

Chủ Đề