Đây là một phương pháp so khớp chuỗi khác. Trong cách tiếp cận này, chúng tôi đang tìm kiếm một chuỗi con bằng cách sử dụng vectơ.
Trong C ++, chúng ta có thể tạo vectơ dễ dàng bằng cách sử dụng thư viện chuẩn. Chúng tôi đang lấy chuỗi chính và chuỗi sẽ được tìm kiếm dưới dạng vector, sau đó tìm kiếm nó thành chuỗi chính. Khi tìm thấy một kết quả khớp, hàm trả về địa chỉ và xóa nó khỏi chuỗi chính. Vì vậy, trong lần lặp tiếp theo, nó bắt đầu từ vị trí 0 và tìm kiếm lại.
Đối với nhiều lần xuất hiện, chúng tôi đang sử dụng các vòng lặp và liên tục tìm kiếm kết quả phù hợp và trả về vị trí.
Đầu vào:Chuỗi chính:“ABAAABCDBBABCDDEBCABC”, Mẫu “ABC” Đầu ra:Mẫu được tìm thấy ở vị trí:4 Vật liệu được tìm thấy ở vị trí:10 Vật chất được tìm thấy ở vị trí:18
Thuật toán
vector_pattern_search (main, substr)
Đầu vào - Văn bản chính và chuỗi con.
Đầu ra - vị trí nơi các mẫu được tìm thấy
Begin p:=điểm bắt đầu của chuỗi chính trong khi r không ở cuối substr và p không ở cuối main, do r:=bắt đầu của substr trong khi mục ở vị trí p &r không giống nhau, và p trong main, hãy thực hiện p:=p + 1 i:=i + 1 done q:=p trong khi mục ở pos p &r là như nhau, và r trong substr và p trong main, thực hiện p:=p + 1 i :=i + 1 r:=r + 1 được thực hiện nếu r vượt quá chuỗi phụ, sau đó xóa lần xuất hiện đầu tiên của chuỗi phụ khỏi chuỗi chính trả về vị trí tìm thấy chất phụ nếu p vượt quá chuỗi chính, sau đó trả về 0 q:=q + 1 p:=q doneEnd
Mã mẫu
#include#include #include using namespace std; void take_string (vector &string) {char c; while (true) {c =getchar (); if (c =='\ n') {break; } string.push_back (c); }} void display (vector string) {for (int i =0; i &main, vector substr) {vector ::iterator p, q, r; int i =0; p =main.begin (); while (r <=substr.end () &&p <=main.end ()) {r =substr.begin (); while (* p! =* r &&p =substr.end ()) {main.erase (main.begin (), q + 1); return (i - substr.size () + 1); } if (p> =main.end ()) return 0; p =++ q; }}
Đầu ra
Nhập chuỗi chính:C ++ là ngôn ngữ lập trình. Nó là ngôn ngữ hướng đối tượng