Alle subsequence Zerlegungen
-
Hallo, ich habe einen String und brauche dafuer alle Sub-Zerlegungen als 2-dimensionales Array/Liste. Zusaetzlich sollte eine Zerlegung mit lentgh == 1 nur auf eine vorherige Zerlegung folgen koennen wenn diese len>1 war.
Bsp.:
Mein string "1234", und die Loesung sollte so aussehen:
[["1234"], ["1", "234"], ["12", "34"], ["123", "4"], ["1", "23", "4"]]Die Zerlegungen
["1, "2", "34"], ["12", "3", "4"] usw. sind aber nicht erlaubt da hier 2 Zerlegungen mit length == 1 aufeinander folgen.Ich habe den Algorithmus bereits in Python
def getSubSequences(self, s, minLength=1): if len(s) >= minLength: for i in range(minLength, len(s) + 1): for p in self.getSubSequences(s[i:], 1 if i > 1 else 2): yield [s[:i]] + p elif not s: yield []Weis aber nicht wie ich diesen in C++ uebertragen kann, da ich hier keine yields habe...
-
Hatte gerade langeweile dahier hier eine einigermaßen direkte Übersetzung deines Perl Codes in C++ (ich hab Null Ahnung von Perl und weiß auch nicht was yield überhaupt macht):
#include <vector> #include <string> #include <iostream> typedef std::vector<std::string> SubSeq; std::vector<SubSeq> getSubSequences(const std::string& s, size_t minLength = 1) { std::vector<SubSeq> result; for(size_t i = minLength; i < s.length(); ++i) { for(auto& p : getSubSequences(s.substr(i), i > 1 ? 1 : 2)) { SubSeq ss(1, s.substr(0, i)); ss.insert(ss.end(), p.begin(), p.end()); result.push_back(std::move(ss)); } } if(s.length() >= minLength) result.push_back(SubSeq(1, s)); return result; } int main() { auto r = getSubSequences("1234"); for(auto& seq : r) { for(auto& ss : seq) std::cout << ss << ' '; std::cout << '\n'; } std::cin.get(); }
-
*räusper* python.
http://www.python-kurs.eu/generatoren.php
-
Oh Python natürlich. Hab ich mich irgendwie verlesen.