Hướng dẫn giải của Kick Start 2022 - Practice 2 - Irregular Expressions

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Bài toán yêu cầu xác định xem chuỗi nhập vào có chứa một chuỗi con liên tiếp thỏa mãn các điều kiện là thần chú:

  1. Thần chú phải có ~3~ "từ": đầu, giữa, cuối.
  2. Từ ở đầu phải giống với từ ở cuối, và cần phải có ít nhất hai âm tiết.
  3. Từ ở giữa phải có ít nhất một âm tiết.

Nhớ rằng một từ được định nghĩa là một chuỗi kí tự độ dài bất kì với tối thiểu một âm tiết. Một âm tiết là một chuỗi độ dài bất kì có tối thiểu một nguyên âm a, e, i, o, u.

Gọi ~S = E~ là từ bắt đầu và từ kết thúc, và ~M~ là từ ở giữa. Gọi ~v_i~ là nguyên âm thứ ~i~ trong chuỗi.

Ta có thể quan sát và tiến hành duyệt qua chuỗi.

  1. Ta có thể xem như ~S~ bắt đầu tại vị trí ~v_1~ và kết thúc tại ~v_2~. Ta có thể bỏ qua tất cả phụ âm đứng trước ~v_1~, và xem như chúng không liên quan gì đến thần chú. Với cách này, ta thỏa mãn điều kiện ~S~ có 2 âm tiết. Tương tự, ta có thể xem những phụ âm phía sau ~S~ thuộc về ~M~, và bỏ qua các phụ âm thừa phía sau ~E~.
  2. Sau đó, ta xác định ~M~ bắt đầu từ sau ~v_2~ và kết thúc ở ~v_3~. Khi đó, ta thõa mãn được điều kiện của ~M~.
  3. Cuối cùng, ta xác định ~E~ bắt đầu từ sau ~v_3~. Nếu ~E=S~, ta có thể kết thúc tìm kiếm. Nếu không có, ta lặp lại quá trình và tìm ~S~ và ~E~ mới.

Khi tìm ~S~ và ~E~ mới. Ta có thể bắt đầu ~S~ tại ~v_2~ và kết thúc ở ~v_3~, và tiếp tục như cách làm ở trên. Nếu sau khi duyệt hết các nguyên âm mà vẫn không tìm ra thần chú, ta xác định rằng xâu không chứa thần chú và có thể in ra Nothing.

Độ phức tạp

Gọi ~N~ là độ dài của chuỗi. Ta duyệt qua toàn bộ chuỗi để tìm ~S, M, E~ với tối đa ~N~ lần trong trường hợp xấu nhất. Vì vậy, độ phức tạp thời gian là ~O(N^2)~.

Một cách làm đơn giản khác là dùng RegEx để tìm thần chú thỏa mãn điều kiện đề bài. Độ phức tạp của các làm này là ~O(N)~. Tuy nhiên, việc dựng RegEx sẽ mất ~O(2^N)~ độ phức tạp thời gian lẫn bộ nhớ, trong đó ~C~ là kích thước của RegEx.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.