Câu hỏi về tần suất xuất hiện kí tự trong string

Em chào mọi người .
Em đang làm bài tập về tuần suất xuất hiện của kí tư trong 1 xâu kĩ tự. Nhưng lại code không đươc . Em mong được các anh chị hướng dẫn em ý tưởng để làm ạ .
Em đang học code bằng C++.
Cảm ơn mọi người nhiều.

bạn thử search c++ map xem có gì hay ho không

2 Likes

Hiện tại hướng làm của bạn là gì. Không cần cao siêu, cũng không cần hoàn chỉnh, chỉ một vài suy nghĩ đơn giản nhất cũng được.
Bạn nghĩ sao về đề bài này?

2 Likes

Em có tìm hiểu qua rồi . Vì em là newbie nên nhìn thấy hơi phức tạp .

Hướng đi của em:
B1: là tạo 1 hàm đếm số lần xuất hiện của char x.
B2: gọi biến found=0 và char flag . Tạo ra 1 vòng lặp i=0 ; i<string.length() ; i++
B3: gọi hàm đếm với x=string[i]. Nếu > found thì gán found với giá trị đếm vừa tìm được và gán flag=string[i] .Làm vậy cho đến hết vòng lặp
B4: tìm được giá trị xuất hiện nhiều nhất.
Em có làm ra được rồi ạ. Nhưng em thấy cách này không tối ưu. Em mong mọi người hướng dẫn cách làm khác .

2 Likes

Mặc dù không biết có tối ưu hơn không nhưng tôi lại nghĩ đến việc số hóa cái xâu đó bro ạ nãy tôi vừa viết thì nó như sau :>

#include <iostream>

using namespace std;

int toNum(char s){

    return s-'a';

}

int main () {

    int n, dem, a[100];

    string s;

    getline(cin, s);

    n=s.length();

    for (int i=0; i<n; i++){

        a[i]=toNum(s[i]);

    }

    for (int i=0; i<n; i++)

    {

        if (s[i]!=' ')

            if (a[i]!=-1)

            {

                dem = 1;

                for (int j=i+1; j<n; j++)

                {

                    if (a[j]==a[i]) {dem++; a[j] = -1;}

                }

                cout << s[i] << " " << dem << endl;

            }

    }

    return 0;

}

Đúng rồi, very good :kissing_heart:. Nhưng với chuỗi như ‘aabcadaaa’ thì hàm đếm ‘a’ được gọi tới 6 lần, mỗi lần lại loop qua cả chuỗi, có cách nào tránh được việc đếm char đã đếm rồi không nhỉ :nerd_face:

Task 2: Nếu tránh được rồi thì với mỗi char phân biệt, vẫn phải loop qua cả chuỗi, có cách nào loop 1 lần là đếm hết được không nhỉ :face_with_monocle::face_with_monocle:

Gợi ý:
Cách 1: cấu trúc dữ liệu hash map cho phép lưu data dưới dạng (key, value). Mỗi key tương ứng với một value. Thời gian truy xuất giữ liệu O(1).

Cách 2: Bảng chữ cái chỉ có 26 ký tự. Vậy có làm cách nào để lưu và update số lần xuất hiện của mỗi ký tự khi loop qua chuỗi 1 lần không nhỉ. :face_with_monocle:

5 Likes

Dạ em cảm ơn anh và mọi người nhiều ạ.

Bạn có thể đếm tần suất của chữ xuất hiện nhiều lần nhất theo cách này:

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

int main()
{
	string s;
	char c;

cin >> s;

unordered_map<char, int> map;

int ans = 0;

for (int j = 0; j < s.size(); j++)
{
	map[s[j]]++;

	if (map[s[j]] > ans) { ans = map[s[j]]; c = s[j]; }
}

cout << "Ky tu xuat hien nhieu nhat: " << c << endl;
cout << "So lan xuat hien: " << map[c] << endl;
return 0;

}

2 Likes

Em cảm ơn anh.
Em chưa học qua thư viện map nên lúc đầu nhìn hơi khó hiểu.
H em hiểu roiofiiii.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?