01/10/2018, 17:24

Xét 2 xâu tương đương

Hai xâu được gọi là tương đương nếu như ta có thể thay đổi thứ tự trong một xâu để có được xâu còn lại.
M.n cho e xin gợi ý để xét 2 xâu tương đương vs ạ. Thanks.

Trần Hoàn viết 19:39 ngày 01/10/2018

Ủa, làm sao mà bài gốc lại bị khoá vậy? Bạn đăng lại câu hỏi cho mọi người nhìn nhé.

Quay lại câu hỏi của bạn:

  1. Dễ dàng nhận thấy nếu xâu 1 và xâu 2 tương đương với nhau và xâu 3 tương đương với xâu 1 thì xâu 3 cũng sẽ tương đương với xâu 2.
  2. Vậy nếu muốn so sánh xâu 1 và xâu 2, ta có thể cùng so sánh chúng với xâu 3 nào đó mà tương đương với xâu 1.
  3. Xâu 3 phải là đồng nhất, tức là với cùng 1 quy tắc biến đổi, bất kỳ xâu nào tương đương với xâu 3 đều cho kết quả là xâu 3.
  4. Trong các quy tắc tìm ra xâu 3, quy tắc phổ biến nhất thường được sử dụng là sắp xếp.
    Ví dụ minh hoạ:

Xâu 1: tranhoan -> Xâu 3 có được từ sắp xếp xâu 1: aahnnort
Xâu 2: hoantran -> Xâu 3 có được từ sắp xếp xâu 2: aahnnort
=> Xâu 1 tương đương Xâu 2

Xâu 1: tranhoan -> Xâu 3 có được từ sắp xếp xâu 1: aahnnort
Xâu 2: hosntran -> Xâu 3 có được từ sắp xếp xâu 2: ahnnorst
=> Xâu 1 không tương đương Xâu 2

Vu Van Chung viết 19:36 ngày 01/10/2018

đếm số ký tự từng loại của mỗi xâu. Nếu chúng bằng nhau hết thì tương đương.
Ví dụ “abb” và “bab” đều có 1 chữ a và 2 chữ b, vậy thì nó biến đổi được cho nhau và tương đương.
Có thể dùng HashMap để lưu

Trương Tấn Phát viết 19:36 ngày 01/10/2018

Đếm số lượng kí tự, nếu tất cả các kí tự đều có số lần xuất hiện bằng nhau thì tương đương.

Hải Phạm viết 19:38 ngày 01/10/2018

thực sự nếu làm như v e nghĩ là liệu n có làm bài toán khó hơn ko a?

Trần Hoàn viết 19:36 ngày 01/10/2018

Không khó, vì hàm sắp xếp có sẵn trong C++ rồi. Nếu không muốn dùng hàm sắp xếp có sẵn, có thể lên mạng tìm rất nhiều code sắp xếp khác nhau.

Việc lưu lại xem mỗi phần tử xuất hiện bao nhiêu lần nó không đơn giản như bạn nghĩ đâu :))
Ở trên có người nói về HashMap. Nó là một cấu trúc phức tạp mà bạn chưa đủ khả năng để hiểu. Đừng vội dùng.

Hải Phạm viết 19:39 ngày 01/10/2018

thanks anh ạ zzzzzzzz

viết 19:27 ngày 01/10/2018

char có 256 giá trị thôi mà làm 1 cái mảng 256 phần tử thay cho hashmap mà đếm

int charCount[256] = {0};
for (char c : s1) charCount[c]++;
for (char c : s2) charCount[c]--;
return std::all_of(charCount, charCount + 256, [](int cnt) { return !cnt; });

sort thì viết code đơn giản hơn nhưng big-O lớn hơn

std::sort(begin(s1), end(s1));
std::sort(begin(s2), end(s2));
return s1 == s2;
Bài liên quan
0