括号题确实是很难写的,速度还是硬伤呀。各种小细节要讨论。
class Solution {
public:
// merge vector<set<string>>
set<string> mergeSets(vector<set<string>> inputs){
set<string> results;
for (int ii=0;ii<inputs.size();ii++){
set<string> temp = inputs[ii];
results.insert(temp.begin(), temp.end());
}
results.erase(",");
return results;
}
// concat sets (has shunxu)
set<string> concatSets(set<string> input1, set<string> input2){
set<string> results;
for (set<string>::iterator it1=input1.begin(); it1!=input1.end(); ++it1){
for (set<string>::iterator it2=input2.begin(); it2!=input2.end(); ++it2){
results.insert(*it1 + *it2);
}
}
return results;
}
// judge set<string> is set(a) or not
bool judgeSet(set<string> input){
if (input.find("{")!=input.end()){
return false;
}
if (input.find("}")!=input.end()){
return false;
}
if (input.find(",")!=input.end()){
return false;
}
return true;
}
// char 2 string
string char2string(char a){
string res = "";
res += a;
return res;
}
// print set
void printset(set<string> input){
for (std::set<string>::iterator it=input.begin(); it!=input.end(); ++it){
cout << *it<<" ";
}
cout<<endl;
}
// main process
vector<string> braceExpansionII(string expression) {
std::stack<std::set<string>> mystack;
for (int i=0;i<expression.size();i++){
/*
// valid stack top
if (!mystack.empty()){
printset(mystack.top());
}*/
// main process /
if (expression[i]=='{' || expression[i]==','){
set<string> temp;
temp.insert(char2string(expression[i]));
mystack.push(temp);
}
else if (expression[i]=='}'){
// merge all sets
vector<set<string>> allsets;
while(!mystack.empty()){
set<string> top = mystack.top();
if (top.find("{")!=top.end()){ // find '{'
mystack.pop();
break;
}
allsets.push_back(mystack.top());
mystack.pop();
}
set<string> mergeset = mergeSets(allsets);
// judge the top
if (!mystack.empty()){
set<string> top = mystack.top();
if (judgeSet(top)){
set<string> result = concatSets(top, mergeset);
mystack.pop();
mystack.push(result);
}
else{
mystack.push(mergeset);
}
}
else{
mystack.push(mergeset);
}
}
else{ // a~z
// set1
string input = "";
while(expression[i] >='a' && expression[i] <='z'){
input += expression[i];
i++;
}
i--;
set<string> temp;
temp.insert(input);
// merge with top
if (!mystack.empty() && judgeSet(mystack.top())){
set<string> result = concatSets(mystack.top(), temp);
mystack.pop();
mystack.push(result);
}
else{
mystack.push(temp);
}
}
}
// merge the left parts
vector<set<string>> allsets;
while(!mystack.empty()){
allsets.push_back(mystack.top());
mystack.pop();
}
set<string> result = mergeSets(allsets);
// change set to vector
vector<string> resultV;
for (std::set<string>::iterator it=result.begin(); it!=result.end(); ++it){
resultV.push_back(*it);
}
return resultV;
}
};