Trong C++ đưa ra sau thói quen:
template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Mark Nelson http://marknelson.us */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator i1 = first;
Iterator i2 = last;
++i1;
if (last == i1)
return false;
i1 = last;
--i1;
i1 = k;
--i2;
while (first != i1)
{
if (*--i1 < *i2)
{
Iterator j = k;
while (!(*i1 < *j)) ++j;
std::iter_swap(i1,j);
++i1;
++j;
i2 = k;
std::rotate(i1,j,last);
while (last != j)
{
++j;
++i2;
}
std::rotate(k,i2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
Sau đó bạn có thể tiến hành làm như sau:
std::string s = "abcde";
for(std::size_t i = 1; i != s.size(); ++i)
{
do
{
std::cout << std::string(s.begin(),s.begin() + i) << std::endl;
}
while(next_combination(s.begin(),s.begin() + i,s.end()));
}
Lưu ý: Đó là bạn nên mong đợi để xem 2^n-1 kết hợp, nơi n là độ dài của mảng hoặc chuỗi.
Nguồn
2010-03-24 15:28:10
sử dụng Mã mẫu – jjj
mảng đã cho là "abcde" ... –