我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:单词中的每个字母可能只有一个选项或存在多个备选项。如果只有一个选项,那么该字母按原样表示。
如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 “{a,b,c}” 表示 [“a”, “b”, “c”]。
例子:"{a,b,c}d{e,f}" 可以表示单词列表 [“ade”, “adf”, “bde”, “bdf”, “cde”, “cdf”]。
请你按字典顺序,返回所有以这种方式形成的单词。
此题不就是linux的正则表达式吗?
1.回溯
class Solution {
public:
vector<string> ans;
void dfs(int u,string cur,string s){
if(u==s.size()) {
ans.push_back(cur);
return ;
}
while(u<s.size()){
if(s[u]=='{'){
int ne=u;
while(s[ne]!='}') ne++;
while(s[++u]!='}'){
if(isalpha(s[u])){
cur.push_back(s[u]);
dfs(ne+1,cur,s);
cur.pop_back();
}
}
return ;
}else {
if(isalpha(s[u])) cur.push_back(s[u++]);
}
}
if(u==s.size()) {
ans.push_back(cur);
}
}
vector<string> expand(string s) {
if(s.size()==0) return ans;
dfs(0,"",s);
sort(ans.begin(),ans.end());
return ans;
}
};