// Created by Vladimir Tsvetkov on 08/07/14. //clear && clear && g++ -o search -std=c++11 -g search.cpp ./../../src/string/unistring.cpp #include #include #include #include #include "../../include/string/unistring.h" class trieNode { public: Unistring data; std::map leaves; bool isFinal; trieNode(); trieNode(Unistring ndata, std::map nleaves); ~trieNode(); }; class Trie { public: trieNode root; Trie(); ~Trie(); std::set searchWordsFromTrie(Unistring pattern); std::set searchWords(trieNode node, Unistring pattern, int curIndex, Unistring formedString); }; std::set Trie::searchWordsFromTrie(Unistring pattern) { Unistring word; std::set finalset = searchWords(root, pattern, 0, word); } int commonPrefix(Unistring data, Unistring pattern, int curIndex) { Unistring cutPattern = *pattern.substr(curIndex); for(int i = 0; i < data.size(); i++) if (i == cutPattern.size() || data[i] != cutPattern[i]) return i; return data.size(); } std::set Trie::searchWords(trieNode node, Unistring pattern, int curIndex, Unistring formedString) { std::cout << "searchWordsCall with curIndex " << curIndex << "\n"; if (node.isFinal && curIndex == (pattern.size() - 1)) { std::set wordSet; wordSet.insert(formedString); return wordSet; } std::set wordSet; Unistring curChar = *pattern.substr(curIndex, curIndex + 1); if (curChar.compare_to()) { Unistring newformedString = formedString; wordSet.insert(searchWords(node, pattern, curIndex + 1, newformedString)); for(auto i:node.leaves) { Unistring newnewformedString = formedString; wordSet.insert(searchWords(i.second, pattern, curIndex, newnewformedString)); } return wordSet; } else { int commonPrefixsize = commonPrefix(node.data, pattern, curIndex); //Unistring commonPrefix = node.data.substring(0, commonPrefixsize); trieNode nextNode; if (commonPrefixsize == node.data.size()) { //поиск от ребенка nextNode = node.leaves[pattern[commonPrefixsize]]; } else { //сплитим ноду Unistring newData = node.data.substr(commonPrefixsize); std::map newleaves = node.leaves; nextNode = trieNode(newData, newleaves); } wordSet.insert(searchWords(nextNode, pattern, curIndex + commonPrefixsize, formedString + node.data)); return wordSet; } } Unistring c_str_to_Unistring(std::string str) { Utf8String strseq = Utf8String((char*)strseq) } void test() { std::set resultset; //Unistring pattern = "ab*ra*"; std::string pattern; std::cin >> pattern; //std::cout << "pattern:\n" << pattern << "\n"; Utf8String patternseq = Utf8String((char*)pattern.c_str()); Unistring patternunistring = Unistring(patternseq); std::cout << "pattern:\n"; patternunistring.print(); std::cout << "\n"; Unistring *substr = patternunistring.substr(0, 2); substr->print(); //resultset.insert(pattern); //Trie trie; //resultset = trie.searchWordsFromTrie(pattern); //for(auto i:resultset) //std::cout << i; } int main(int argc, const char * argv[]) { test(); return 0; }