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<List<String>> generate(List<String> str)
{
    // Validations...
    
    List<String> cur = new ArrayList<>(str.size());
    Lists.fill(cur, "*");    
    List<List<String>> result = new ArrayList<>();
    help(str, 0, cur, result);
    return result;
}

private void help(List<String> str, int start, List<String> cur, List<List<String>> result)
{
    result.add(new ArrayList<String>(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, "*");
    }
}