Юзай формулу
vector<string> Generate(string s) {
if(s.length() == 1) return {s};
vector<string> ans;
last = s.back();
s = s.substring(0,s.length()-1);
vector<string> prev = Generate(s);
for (const string &entry : prev) {
ans.push_back(entry + last);
ans.push_back(entry + "." + last);
}
return ans;
}
Можно этот же подход использовать и более функционально сделать, если вам надо.
Исходя из такой реализации это может быть и два метода или два прохода, что не будет являться линейной сложностью.