2
Tìm chuỗi con T1 có trong chuỗi T2 hay không trong C++?
0
Hiệp Hào30 đã đăng:

Cho mình hỏi làm thế nào để xác định xem chuỗi T1 có nằm trong chuỗi T2 hay không, ví dụ mình có chuỗi T1 và T2 như sau.

T1: clo

T2: aaabclobbbbcdcllo

Nếu có tồn tại chuỗi T1 trong T2, chương trình cần trả về vị trí bắt đầu của chuỗi T1 trong T2, trong trường hợp này là vị trí chỉ số mảng thứ 4 trong T2, nếu không có thì trả về -1, nếu có nhiều chuỗi con T1 trong T2 thì chỉ việc trả về vị trí tìm thấy chuỗi con T1 trong T2 đầu tiên là dừng thuật toán, không cần xét tiếp.

Cảm ơn các bạn.

thêm bình luận...
1
quangvu30 đã đăng:

Ý 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ề jcủ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.

đã bổ sung 5.2 năm trước bởi
Avatar: quangvu quangvu30
1

Mình nghĩ đoạn mã nguồn:

for (int j = 0; j < T1.length(); j++) {
    if (T2[j + i] == T1[j])
        count += 1;
}

nên sửa thành:

for (int j = 0; j < T1.length(); j++) {
    if (T2[j + i] == T1[j])
        count += 1;
    else
        break;
}

Bởi vì khi phát hiện vị trí i bất kỳ của chuỗi T2 không còn trùng với vị trí j của chuỗi T1 nữa thì nên dừng vòng lặp j ngay tại đó luôn chứ không cần phải duyệt tiếp nữa, như thế sẽ hiệu quả hơn khi chuỗi T1 dài.

viétkâz 24.02.2019

Cảm ơn bạn đã góp ý.

quangvu 24.02.2019
thêm bình luận...
0
Cộng đồng đã đăng:

Chúng ta dùng hàm strstr để Tìm chuỗi con T1 có trong chuỗi T2 hay không trong C++.

Link tham khảo: Tìm kiếm chuỗi trong C++ (strchr, strstr)

thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)