void dfsRemove(string s, vector<string>&ret,int last_break, int last_removal,vector<char>&par){ int stack = 0; int break_index = last_break; for(int i = last_break;i<s.size();i++){ if(s[i] == par[0]){ stack++; }else if(s[i] == par[1]){ stack--; } if(stack<0){ break_index = i; break; } } if(stack<0){ for(int j = last_removal;j<=break_index;j++){ if(s[j] == par[1] && (j == last_removal || s[j-1] != par[1]) ){ string sub = s.substr(0,j) + s.substr(j+1,s.size()); dfsRemove(sub,ret,break_index,j,par); } } return; } string s_copy = s; reverse(s_copy.begin(),s_copy.end()); if(par[0] == '('){ cout << " need to reverse" <<endl; vector<char> parR = { ')','('}; dfsRemove(s_copy,ret,0,0,parR); }else{ ret.push_back(s_copy); } }
vector<string> removeInvalidParentheses(string s) { vector<char> par; par.resize(2); par[0] = '('; par[1] = ')'; vector<string> ret; dfsRemove(s,ret,0,0,par); return ret; }
int main(int argc, char* argv[]){ const char* options[] = {"-u", "upload", "-d", "download", \ "-h", "help", "-l", "list", "-r", "remove", 0}; int op; if (argc != 3 && argc != 2){ helpInfo(); return 0; } op = getOption(options, argv[1]); switch(op){ case 0: case 1: if (argc == 2){ fprintf(stdout, "Please input the filename!\n"); exit(0); } if (access(argv[2], R_OK)){ fprintf(stdout, "File '%s' not exists,\n", argv[2]); fprintf(stdout, "Or permession denied.\n"); fprintf(stdout, "Please check the filename.\n"); exit(0); } if(!uploadFile(argv[2])) fprintf(stdout, "Upload %s success\n", argv[2]); break; case 2: case 3: if (argc == 2){ fprintf(stdout, "Please input the filename!\n"); exit(0); } if(!downloadFile(argv[2])) fprintf(stdout, "Downloadload %s success\n", argv[2]); break; case 4: case 5: helpInfo(); break; case 6: case 7: if (argc == 2){ fprintf(stdout, "Please input the filename!\n"); exit(0); } dfsList(argv[2]); break; case 8: case 9: if (argc == 2){ fprintf(stdout, "Please input the filename!\n"); exit(0); } if (!dfsRemove(argv[2])) fprintf(stdout, "Delete %s success\n", argv[2]); break; default: exit(-1); } exit(0); }