Cho mảng chuỗi str[] và chuỗi mẫu pat. Mục tiêu là tìm các phần tử chuỗi của str[] có mẫu pat ở cuối.
Ta sẽ duyệt từng chuỗi của str và so sánh các ký tự cuối với pat. Nếu khớp thì tăng biến đếm.
Hãy hiểu qua các ví dụ.
Đầu vào
str[]={ "kittens", "hens", "deers", "dogs" } pat="ens"
Đầu ra
Số chuỗi kết thúc bằng mẫu cho trước: 2
Giải thích
Chuỗi "kitt-ens" và "h-ens" kết thúc bằng "ens".
Đầu vào
str[]={ "tickets", "wickets", "bats", "cricket" } pat="et"
Đầu ra
Số chuỗi kết thúc bằng mẫu cho trước: 1
Giải thích
Chuỗi "wick-et" kết thúc bằng "et".
Phương pháp sử dụng trong chương trình dưới đây
- Nhận mảng chuỗi str[] và chuỗi mẫu pat.
- N là số chuỗi trong str[].
- Hàm
endPattern(string str[], int n, string ptr)trả về số chuỗi trong str kết thúc bằng mẫu cho trước. - Khởi tạo biến count = 0.
- Duyệt bằng vòng lặp for từ i=0 đến i<n.
- Lấy từng chuỗi str[i] làm s. slen là s.length().
- plen = ptr.length(). flag = 1.
- Giảm plen và slen đi 1 để lấy chỉ số cuối của chuỗi s và mẫu ptr.
- Dùng vòng lặp while kiểm tra cho đến plen >= 0.
- Nếu bất kỳ s[slen] != ptr[plen]. Gán flag=0 và thoát vòng lặp. Ngược lại giảm plen và slen để kiểm tra ký tự tiếp theo từ cuối.
- Sau khi while kết thúc, nếu flag vẫn là 1 thì tăng count vì ptr xuất hiện trong s.
- Trả về count sau tất cả vòng lặp là số chuỗi kết thúc bằng mẫu cho trước.
Ví dụ
#include <bits/stdc++.h>
using namespace std;
int endPattern(string str[], int n, string ptr) {
int count = 0;
for(int i = 0; i < n; i++) {
string s = str[i];
int slen = s.length();
int plen = ptr.length();
int flag = 1;
slen--; // chỉ số cuối
plen--;
while(plen >= 0) {
if(ptr[plen] != s[slen]) {
flag = 0;
break;
}
plen--;
slen--;
}
if(flag == 1) {
count++;
}
}
return count;
}
int main() {
string patrn = "pes";
int N = 4;
string str[] = { "stripes", "cars", "ripes", "pipes" };
cout << "Số chuỗi kết thúc bằng mẫu cho trước: " << endPattern(str, N, patrn);
return 0;
}
Đầu ra
Nếu chạy mã trên sẽ cho kết quả sau:
Số chuỗi kết thúc bằng mẫu cho trước: 3