Ý tưởng đơn giản nhất là tại mỗi vị trí i
của chuỗi T2, bạn thực hiện so sánh với vị trí đầu tiên j = 0
của chuỗi T1, nếu giống nhau thì duyệt tiếp các vị trí nằm kề i
của chuỗi T2 với các vị trí nằm kề j
của chuỗi T1 và duyệt cho đến khi hết chuỗi T1, nếu khác thì không cần quan tâm nữa, tiếp tục duyệt chuỗi T2 và lặp lại quá trình trên.
#include <iostream>
using namespace std;
int isMatching(string T1, string T2) {
// Duyệt chuỗi T2
for (int i = 0; i < T2.length(); i++) {
// So sánh với vị trí đầu tiên của chuỗi T1
if (T2[i] == T1[0]) {
int count = 0;
// Nếu điều kiện trên xảy ra, tiếp tục duyệt các vị trí
// nằm kề i của T2 và nằm kề j của chuỗi T1
for (int j = 0; j < T1.length(); j++) {
if (T2[j + i] == T1[j])
count += 1;
}
// Sử dụng biến đếm count với mục đích đếm có bao nhiêu
// kí tự trong chuỗi T2 trùng với T1, qua một lượt đếm (tức là vòng lặp j hoàn thành)
// nếu biến count bằng chiều dài của chuỗi T1 tức là tồn tại
// chuỗi T1 trong T2, trả về vị trí trùng, tức là vị trí i
if (count == T1.length()) return i;
}
}
return -1;
}
int main() {
string T1 = "clo";
string T2 = "aaabclobbbbcdcllo";
cout << isMatching(T1, T2);
}
Ý tưởng trên khá đơn giản nhưng có thể không hiệu quả khi gặp chuỗi dài, thực tế còn rất nhiều giải pháp khác, hy vọng sẽ giúp được bạn.