-
Notifications
You must be signed in to change notification settings - Fork 0
/
PTIT121C.cpp
95 lines (82 loc) · 3.25 KB
/
PTIT121C.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
using namespace std;
// Prototype của hàm con
bool checkMatch(string fileName, string formatName);
int main()
{
// Nhập vào định dạng tên file cho trước
string formatName;
cin >> formatName;
// Nhập vào số bộ test
int numberOfTestCases;
cin >> numberOfTestCases;
// Xử lý từng bộ test
while (numberOfTestCases--)
{
// Nhập vào tên file
string fileName;
cin >> fileName;
// Kiểm tra tên file có đúng format không
bool isMatching = checkMatch(fileName, formatName);
// Nếu trùng thì in ra tên file đó
if (isMatching)
{
cout << fileName << endl;
}
}
return 0;
}
// Hàm kiểm tra fileName có khớp với formatName hay không
bool checkMatch(string fileName, string formatName)
{
bool isMatching = true; // Cờ dùng để kiểm tra fileName có khớp với định dạng của formatName hay không
int indexInFormatName = formatName.length() - 1; // Dùng để duyệt qua từng ký tự của formatName
int indexInFileName = fileName.length() - 1; // Dùng để duyệt qua từng ký tự của fileName
// Chạy vòng lặp để kiểm tra fileName có khớp với formatName hay không
while (indexInFormatName >= 0 || indexInFileName >= 0)
{
// Nếu gặp ký tự '*' thì
if (formatName[indexInFormatName] == '*')
{
// Tiếp tục duyệt formatName đến khi nào gặp ký tự khác ký tự '*'
while ((formatName[indexInFormatName] == '*') && (indexInFormatName >= 0))
{
indexInFormatName--;
}
// Nếu duyệt hết formatName vẫn không thấy ký tự nào khác ký tự * (tức là formatName toàn dấu '*') thì thoát khỏi
// vòng lặp Trường hợp này mọi fileName sẽ đều hợp lệ
if (indexInFormatName == -1)
{
break;
}
// Duyệt fileName đến khi nào gặp ký tự trùng với ký tự hiện tại của formatName thì dừng lại
// Bởi vì những ký tự khác với ký tự hiện tại sẽ tương đương với việc mapping với ký tự * ở formatName
while ((fileName[indexInFileName] != formatName[indexInFormatName]) && (indexInFileName >= 0))
{
indexInFileName--;
}
// Nếu duyệt hết fileName không tìm thấy ký tự trùng với ký tự hiện tại của formatName, thì chuỗi này không khớp
// với format, kết thúc vòng lặp
if (indexInFileName == -1)
{
isMatching = false;
break;
}
}
// Nếu không gặp ký tự '*' thì so sánh ký tự tương ứng giữa formatName và fileName
else
{
if (formatName[indexInFormatName] != fileName[indexInFileName])
{
isMatching = false;
break;
}
else
{
indexInFormatName--;
indexInFileName--;
}
}
}
return isMatching;
}