Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Truy vấn tần suất ký tự trong xâu con trong C++


Trong bài toán này, ta được cho một xâu. Và Q truy vấn, mỗi truy vấn có hai số nguyên l và r và ký tự ch. Nhiệm vụ là tạo chương trình giải quyết truy vấn: tần suất ký tự trong xâu con trong C++.

Mô tả bài toán

Với mỗi truy vấn, ta tìm tần suất xuất hiện của ký tự 'ch' trong xâu con str[l...r].

Ví dụ minh họa

Đầu vào

str = "tutorialspoint"
Q = 2
0 6 t
5 13 i

Đầu ra

2 2

Giải thích

Truy vấn 1 – xâu con là "tutoria", ký tự 't' xuất hiện 2 lần.

Truy vấn 2 – xâu con là "ialspoint", ký tự 'i' xuất hiện 2 lần.

Phương pháp giải

Cách trực tiếp: duyệt xâu từ l đến r cho mỗi truy vấn và đếm số lần xuất hiện của ký tự ch.

Chương trình minh họa:

Ví dụ

#include <bits/stdc++.h>
using namespace std;

struct Query {
    int l, r;
    char ch;
};

int CalcCharFreq(string str, Query queries) {
    int count = 0;
    for(int i = queries.l; i < queries.r; i++) {
        if(str[i] == queries.ch)
            count++;
    }
    return count;
}

int main() {
    string str = "tutorialspoint";
    int Q = 2;
    Query queries[Q];
    queries[0].l = 0;
    queries[0].r = 5;
    queries[0].ch = 't';
    queries[1].l = 5;
    queries[1].r = 13;
    queries[1].ch = 'i';
    for(int i = 0; i < Q; i++)
        cout << "For Query " << (i+1) << ": The frequency of occurrence of character '"
             << queries[i].ch << "' is " << CalcCharFreq(str, queries[i]) << "\n";
    return 0;
}

Đầu ra

For Query 1: The frequency of occurrence of character 't' is 2
For Query 2: The frequency of occurrence of character 'i' is 2

Cách tiếp cận khác là dùng mảng tiền tính. Tạo mảng 2D lưu tần suất ký tự đến chỉ số i. Tức freq[3][2] lưu tần suất ký tự 'c' tại chỉ số 2. Ban đầu tất cả tần suất = 0.

Sau đó tiền tính tần suất tại mỗi chỉ số. Khi truy vấn, tần suất trong khoảng = freq[r][ch] - freq[l-1][ch] (cần xử lý biên).

Ví dụ

#include <bits/stdc++.h>
using namespace std;

int charFreq[100][26];

struct Query {
    int l, r;
    char ch;
};

void countCharFreq(string str, int size) {
    memset(charFreq, 0, sizeof(charFreq));
    for (int i = 0; i < size; i++) {
        charFreq[i][str[i] - 'a']++;
    }
    for (int i = 1; i < size; i++) {
        for (int j = 0; j < 26; j++)
            charFreq[i][j] += charFreq[i - 1][j];
    }
}

int CalcCharFreq(Query queries) {
    return charFreq[queries.r][queries.ch - 'a'] - charFreq[queries.l][queries.ch - 'a'];
}

int main() {
    string str = "tutorialspoint";
    int size = str.length();
    int Q = 2;
    countCharFreq(str, size);
    Query queries[Q];
    queries[0].l = 1;
    queries[0].r = 13;
    queries[0].ch = 't';
    queries[1].l = 4;
    queries[1].r = 13;
    queries[1].ch = 'i';
    for(int i = 0; i < Q; i++)
        cout << "For Query " << (i+1) << ": The frequency of occurrence of character '"
             << queries[i].ch << "' is " << CalcCharFreq(queries[i]) << "\n";
    return 0;
}

Đầu ra

For Query 1: The frequency of occurrence of character 't' is 2
For query 2: The frequency of occurrence of character 'i' is 2