Chào mọi người ạ. Em đang học về thư viện chuẩn C++ phần set thì có bài tập như thế này:
Trong ngôn ngữ Aramic từ có thể đại diện cho các đối tượng.
Các từ trong Aramic có tính chất đặc biệt:
- Một từ là một gốc nếu nó không chứa cùng một chữ cái nhiều lần.
- Một gốc và tất cả các hoán vị của nó cũng chỉ đại diện cho cùng một đối tượng.
- Từ gốc
x
của một từy
là từ chứa tất cả các chữ cái xuất hiện trong y theo cách mà mỗi chữ cái xuất hiện một lần. Ví dụ: gốc của"aaaa"
,"aa"
,"aaa"
là"a"
, gốc của"aabb"
,"bab"
,"baabb"
,"ab"
là"ab"
.- Bất kỳ từ nào trong Aramic đại diện cho cùng một đối tượng với gốc của nó.
Bạn có một dãy từ Aramic. Hãy đưa ra số lượng đối tượng khác nhau trong dãy đó.
Ví dụ:
- Với
words = ["a","aa","aaa","ab","abb"]
thì kết quả là:aramic(words) = 2.
thì có code mẫu là thế này
int aramic(std::vector<std::string> words)
{
set<string> s;
for(int i=0; i<words.size(); i++){
string str = words[i];
set<char> ch;
for(int j=0; j<str.length(); j++){
ch.insert(str[j]);
}
string e="";
for(auto x:ch) e+=x;
s.insert(e);
}
return s.size();
}
Em không hiểu rõ đoạn for lắm, có ai giải thích giúp em đoạn này được không ạ? Đoạn này theo em hiểu là lưu vector word vào string str, sau đó khởi tạo set<char>ch
để kiểm tra, sau đó tiếp tục một vòng lặp thêm các phần tử trong str vào set chạy từ phần tử đầu tiên đến phần tử cuối của string str. Ở đây là set<char>
nên em thắc mắc khi insert vào nó sẽ như thế nào, ví dụ như “bda” thì vào trong set<char>
nó sẽ là ‘b’,‘d’,‘a’ hay nó vẫn là ‘bda’, hay là sẽ ra kết quả khác vì em thấy đầu ra như 2 kiểu trên đều sai sai…?