Question:

Given a list of string, like (a, b, c), return a list: (*, *, *), (a, *, *), (*, b, *), (*, *, c), (a, b, *), (a, * , c), (* , b, c), (a, b, c).

// NP
public List> generate(List str)
{
    // Validations...
    
    List cur = new ArrayList<>(str.size());
    Lists.fill(cur, "*");    
    List> result = new ArrayList<>();
    help(str, 0, cur, result);
    return result;
}

private void help(List str, int start, List cur, List> result)
{
    result.add(new ArrayList(cur));
    if (start >= str.size())
        return;
    
    for (int i = start ; i < str.size() ; i ++)
    {
        cur.set(i, str.get(i));
        
        help(str, i + 1, cur, result);
        
        cur.set(i, "*");
    }
}