-class scape{
-private:
- lset& dic;
- int numLetters;
- vector<char> letters;
- int findWords(){
- cout << "Find words: blank as '*' || back new scape: 0 \n->";
- string str;
- cin >> str;
- if(str[0] == '0')
- return 1;
- vector<char> word;
- vector<bool> lstat(letters.size(), false);
- for(int i = 0; i < str.length(); i++){
- if(str[i] == '*')
- word.push_back('*');
- else{
- char ch;
- if(str[i] >= 'a' && str[i] <= 'z')
- ch = str[i];
- else if(str[i] >= 'A' && str[i] <= 'Z')
- ch = str[i]-'A'+'a';
- for(int k = 0; k < letters.size(); k++){
- if(letters[k] == ch && lstat[k] == false){
- lstat[k] = true;
- word.push_back(ch);
- break;
- }
- }
- }
- }
- int sizeW = word.size();
- set<string> ans;
- finding(word, lstat, 0, sizeW, "", ans);
- for(auto& w: ans)
- cout << w << endl;
- return 0;
- }
- void finding(vector<char> w, vector<bool> lst, int pos, int ws, string str, set<string>& ans){
- if(pos == ws){
- if(dic.find(&(str)[0]))
- //cout << str << endl;
- ans.insert(str);
- return;
- }
- if(pos != 0 && !dic.prefix(&(str+'\0')[0]))
- return;
- if(w[pos] == '*'){
- for(int i = 0; i < lst.size(); i++){
- if(lst[i] == false){
- string st = str+letters[i];//cout <<'-'<<st<<endl;
- vector<bool> lst_(lst);
- lst_[i] = true;
- finding(w, lst_, pos+1, ws, st, ans);
- }
- }
- }
- else{
- str += w[pos];
- finding(w, lst, pos+1, ws, str, ans);
- }
- }
-public:
- scape(lset& dic): dic(dic){
- cout << "add letters || back new scape: 0 \n->";
- string str;
- cin >> str;
- if(str[0] == '0')
- return;
- for(int i = 0; i < str.length(); i++){
- if(str[i] >= 'a' && str[i] <= 'z')
- letters.push_back(str[i]);
- else if(str[i] >= 'A' && str[i] <= 'Z')
- letters.push_back(str[i]-'A'+'a');
- }
- numLetters = letters.size();
- while(findWords() == 0);
- }
-};
+class scape {
+ private:
+ lset& dic;
+ int numLetters;
+ vector<char> letters;
+ int findWords() {
+ cout << "Find words: blank as '*' || back new scape: 0 \n->";
+ string str;
+ cin >> str;
+ if (str[0] == '0') return 1;
+ vector<char> word;
+ vector<bool> lstat(letters.size(), false);
+ for (int i = 0; i < str.length(); i++) {
+ if (str[i] == '*')
+ word.push_back('*');
+ else {
+ char ch;
+ if (str[i] >= 'a' && str[i] <= 'z')
+ ch = str[i];
+ else if (str[i] >= 'A' && str[i] <= 'Z')
+ ch = str[i] - 'A' + 'a';
+ for (int k = 0; k < letters.size(); k++) {
+ if (letters[k] == ch && lstat[k] == false) {
+ lstat[k] = true;
+ word.push_back(ch);
+ break;
+ }
+ }
+ }
+ }
+ int sizeW = word.size();
+ set<string> ans;
+ finding(word, lstat, 0, sizeW, "", ans);
+ for (auto& w : ans) cout << w << endl;
+ return 0;
+ }
+ void finding(vector<char> w, vector<bool> lst, int pos, int ws, string str,
+ set<string>& ans) {
+ if (pos == ws) {
+ if (dic.find(&(str)[0]))
+ // cout << str << endl;
+ ans.insert(str);
+ return;
+ }
+ if (pos != 0 && !dic.prefix(&(str + '\0')[0])) return;
+ if (w[pos] == '*') {
+ for (int i = 0; i < lst.size(); i++) {
+ if (lst[i] == false) {
+ string st = str + letters[i]; // cout <<'-'<<st<<endl;
+ vector<bool> lst_(lst);
+ lst_[i] = true;
+ finding(w, lst_, pos + 1, ws, st, ans);
+ }
+ }
+ } else {
+ str += w[pos];
+ finding(w, lst, pos + 1, ws, str, ans);
+ }
+ }