String permutation using iteration and a filter
Are you sure this is C++?

...because this is almost 100% C. Let's go over some things:


#define is discouraged in modern C++, as is reliance on the C preprocessor in general. Just define your constants with const and (depending on the situation) constexpr.
Don't define raw arrays. Use std::array for fixed size arrays, std::vector for dynamic arrays, or any other standard container class.
Don't use char arrays if you mean strings. C++ offers std::string for general string handling and std::stringstream for string building.
Use standard algorithms. For example, your first for-loop could be replaced with a call to std::fill.


That said, there are

Other Issues


Don't use std::endl. '\n' does the same thing, but doesn't include the unnecessary flush std::endl comes with.
You don't need char_set and int_set. You can generate all lowercase letter by adding their offset in the alphabet to 'a' (i.e. 'a' + 1 == 'b') thanks to the (almost) ubiquitous ASCII encoding. The same is true for digits.
int is not the right type for index variables. Use somethings more appropriate, such as std::size_t, instead.
You should export some of your code to proper functions. Just putting everything into main makes your code hard to read and prone to bugs.
As Cris Luengo pointed out in the comments already, string is not null-terminated, and thus you're causing undefined behavior when writing it to std::cout.
filter is one character longer than it needs to be. Since you never do something with it that would require it to be null terminated (and don't even null terminate the string, just keep an unused character at the end), it suffices to make its length FILTER_LEN.