Hinweise zur Datenstruktur – klassische Hochfrequenzfragen aneinanderreihen

1 – Alle Teilsequenzen der Zeichenfolge drucken

Thema:

        Gibt alle Teilsequenzen einer Zeichenfolge zurück (einschließlich leerer Zeichenfolgen).

Hauptideen:

        Heftige Aufzählung, ob das aktuelle Zeichen hinzugefügt werden soll;

#include <iostream>
#include <vector>
#include <string>

class Solution{
public:
    std::vector<std::string> Printstr(std::string str){
        if(str.length() == 0) return res;
        process(str, 0, "");
        return res;
    }

    void process(std::string str, int i, std::string cur_str){
        if(i == str.length()){
            res.push_back(cur_str);
            return;
        }
        process(str, i+1, cur_str+str[i]); // 加入当前字符
        process(str, i+1, cur_str); // 不加入当前字符
    }

private:
    std::vector<std::string> res;

};


int main(int argc, char *argv[]){
    Solution S1;
    std::string test = "abc";
    std::vector<std::string> res = S1.Printstr(test);
    for(std::string str : res) std::cout << str << std::endl;
}

2 – Vollständige Anordnung der Saiten

Hauptideen:

        Verwenden Sie die vollständige Permutation, um die Zeichenfolge zu durchlaufen. Achten Sie auf das Beschneiden wiederholter Zeichen auf der Baumebene (behalten Sie jedoch die Anordnung wiederholter Zeichen auf dem Baumzweig bei). 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

class Solution {
public:
    std::vector<std::string> permutation(std::string s){
        if(s.length() == 0) return res;
        std::vector<bool> used(s.length(), false);
        std::sort(s.begin(), s.end());
        std::string tmp = "";
        process(s, 0, tmp, used);
        return res;
    }

    void process(std::string str, int idx, std::string tmp, std::vector<bool> used){
        if(idx == str.length()){
            res.push_back(tmp);
            return;
        }
        for(int i = 0; i < str.length(); i++){
            if(used[i] == true) continue; // 该字符已使用
            // 去除树层重复字符
            if(i > 0 && str[i] == str[i-1] && used[i-1] == true) continue;
            used[i] = true;
            process(str, idx + 1, tmp + str[i], used);
            // 回溯
            used[i] = false;
        }
    }

private:
    std::vector<std::string> res;
};

int main(int argc, char *argv[]){
    std::string test = "aab";
    Solution S1;
    std::vector<std::string> res = S1.permutation(test);
    for(std::string str : res) std::cout << str << std::endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43863869/article/details/132304548
Recomendado
Clasificación