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();
    }
    




  • Oh Python natürlich. Hab ich mich irgendwie verlesen.


Anmelden zum Antworten