写了两个小时,非常麻烦的一道模拟题。
关键在于,缓存字符串,和缓存数组嵌套判断,没有 case,这题过不了😂
/*
* @lc app=leetcode id=1096 lang=cpp
*
* [1096] Brace Expansion II
*/
// @lc code=start
class Solution {
public:
vector<string> duplicate(vector<vector<string>>& v){
map<string, int> mp;
vector<string> ans;
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++){
if(mp[v[i][j]] == 0 ){
ans.push_back(v[i][j]);
mp[v[i][j]] = 1;
}
}
}
sort(ans.begin(), ans.end());
return ans;
}
int findR(string& expression, int L) {
int cnt = 0;
for(int i=L;i<expression.size();i++){
if(expression[i] == '{'){
cnt ++ ;
continue;
}
if(expression[i] == '}'){
cnt -- ;
if(cnt == 0){
return i;
}
continue;
}
}
return -1;
}
vector<string> solve(string& expression, int L, int R){
vector<vector<string>> ans;
vector<string> now;
string str ;
int i = L;
while( i < R ){
// 逗号
if(expression[i] == ','){
if(now.size() > 0){
for(int k=0;k<now.size();k++){
now[k] = now[k] + str;
}
}else{
now.push_back(str);
}
ans.push_back(now);
now = vector<string>{};
str = "";
i ++ ;
continue;
}
// 左括号
if(expression[i] == '{'){
int j = findR(expression, i);
vector<string> sub = solve(expression, i+1, j);
if(now.size() > 0){
if(str != ""){
for(int k=0;k<now.size();k++){
now[k] = now[k] + str;
}
}
int a = now.size(), b = sub.size();
vector<string> tNow(a * b);
for(int x=0;x<a;x++){
for(int y=0;y<b;y++){
tNow[x*b + y] = now[x] + sub[y];
}
}
now = tNow;
}else{
now = sub;
if(str != ""){
for(int k=0;k<now.size();k++){
now[k] = str + now[k];
}
}
}
i = j + 1;
str = "";
continue;
}
// 字母
str += expression[i++];
}
if(str != ""){
if(now.size() > 0){
for(int k=0;k<now.size();k++){
now[k] = now[k] + str;
}
ans.push_back(now);
return duplicate(ans);
}
ans.push_back(vector<string>{str});
return duplicate(ans);
}
if(now.size()>0){
ans.push_back(now);
}
return duplicate(ans);
}
vector<string> braceExpansionII(string expression) {
int N = expression.size();
if(N <= 1){
return vector<string>{expression};
}
return solve(expression, 0, N);
}
};
// @lc code=end