leetcode алгоритм возвратов - основа сложности

Существуют прямые ДФС, будь то консолидировать

Monogram номер телефона

Учитывая строка содержит только числовые символы 2-9, он может вернуть все буквы комбинации, указанной.

При цифровой карты с буквами следующим образом (один и тот же телефонный ключ). Примечание 1 не соответствует какому-либо алфавита.

изображение

мышление

Был обыск, к финишу судить, были ли, это не появлялось, то в коллекции

код

class Solution {
    set<string>s;
    map<char,string>m;
public:
    
    void dfs(string d, string cur, int step){
        if(step>d.size()){
            return;
        }
        if(step==d.size()){
            if(s.count(cur)>0){
                return;
            }else{
                s.insert(cur);
            }
        }
        string tmp=m[d[step]];
        for(int i=0;i<tmp.size();++i){
            dfs(d,cur+tmp[i],step+1);
        }
    }
    
    vector<string> letterCombinations(string digits) {
        m.insert(make_pair('2',"abc"));
        m.insert(make_pair('3',"def"));
        m.insert(make_pair('4',"ghi"));
        m.insert(make_pair('5',"jkl"));
        m.insert(make_pair('6',"mno"));
        m.insert(make_pair('7',"pqrs"));
        m.insert(make_pair('8',"tuv"));
        m.insert(make_pair('9',"wxyz"));
        string s1;
        vector<string>ans;
        if(digits.size()==0){
            return ans;
        }
        dfs(digits,s1,0);
        for(auto i = s.begin(); i!=s.end();++i){
            ans.push_back(*i);
        }
        return ans;
    }
};

Формирует кронштейны

N представляет собой количество генерации в скобках, вы написать функцию, можно сгенерировать все возможные комбинации скобок и эффективных.

Например, при п = 3, для генерации результата является:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

мышление

Первый, конечно, левая скобка, а затем поиск, каждое место может быть «(» или «)», обратите внимание на взаимосвязь между числом левых и правых скобок поиска

код

class Solution {
    vector<string>ans;
    bool ok(const string&s){
        stack<char>st;
        for(int i=0;i<s.size();++i){
            if(s[i]=='('){
                st.push(s[i]);
            }else{
                if(st.empty()){
                    return false;
                }else{
                    char c=st.top();
                    if(c!='(')return false;
                    else st.pop();
                }
            }
        }
        return st.empty();
    }
public:
    void dfs(string cur,int L,int R,int total){
        if(L+R>total)return;
        if(abs(L-R)>total-L-R)return;
        if(L+R==total){
            if(L!=R){
                return;
            }else{
                if(ok(cur)){
                    ans.push_back(cur);   
                }
                return;
            }
        }
        dfs(cur+'(',L+1,R,total);
        dfs(cur+')',L,R+1,total);
    }
    vector<string> generateParenthesis(int n) {
        if(n==0)return ans;
        dfs("(",1,0,2*n);
        return ans;
    }
};

Полный набор

Учитывая последовательность цифр не повторяется, все возможное возвращение к полной перестановке.

Пример:

Входные данные : [1,2,3]
Выход:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

мышление

ДФС, со следующим элементом массива к записи , которую вы получили доступ
метод также эффективен для повторяющихся элементов

код

class Solution {
public:
    void dfs(int step,vector<int>cur,vector<int>&nums,int*vis,vector<vector<int>>&ans){
        if(step>nums.size())return;
        if(step==nums.size()){
            ans.push_back(cur);
            return;
        }
        for(int i=0;i<nums.size();++i){
            if(!vis[i]){
                vis[i]=1;
                cur.push_back(nums[i]);
                dfs(step+1,cur,nums,vis,ans);
                vis[i]=0;
                cur.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        if(nums.size()==0)return ans;
        int vis[nums.size()];
        memset(vis,0,sizeof(vis));
        vector<int>tmp;
        dfs(0,tmp,nums,vis,ans);
        return ans;
    }
};

Коллекция по уходу за детьми

Принимая во внимание множество не повторяющегося элемент массива целочисленного НУМСА, который возвращает массив из всех возможных подмножеств (комплект) мощности.

Описание: Решение Set не может содержать повторяющиеся подмножества.

Пример:

Входной сигнал: НУМС = [1,2,3]
Выход:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

мышление

С вся конструкция очень похожа, но не может быть повторена ([1,2] и [2,1] является подмножеством то же) ,
так что диапазон поиска ограничен после того, как слева, т.е. только от крупных к малым ([1,2], [1,3], [2,3])
так, чтобы не повторить

код

class Solution {
public:
    void dfs(int step, vector<int> cur,int left,int*vis, int limit,const vector<int>&nums, vector<vector<int>>&ans){
        if(step>limit)return;
        if(step==limit){
            ans.push_back(cur);
            return;
        }
        for(int i=left;i<nums.size();++i){
            if(!vis[i]){
                vis[i]=1;
                cur.push_back(nums[i]);
                dfs(step+1,cur,i+1,vis,limit,nums,ans);
                cur.pop_back();
                vis[i]=0;
            }
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int>emp;
        ans.push_back(emp);
        int vis[nums.size()];
        if(nums.size()==0)return ans;
        for(int i=1;i<=nums.size();++i){
            memset(vis,0,sizeof(vis));
            dfs(0,emp,0,vis,i,nums,ans);
        }
        return ans;
    }
};

слова поиска

Учитывая двумерную сетку и слово, чтобы выяснить, существует ли слово в сетке.

Слова должны, буквы в соседних ячейках, образующих по алфавиту, где «соседними» клетки, которые являются смежными по горизонтали или по вертикали соседние клетки. Письма в пределах одной и той же клетке не может быть использован повторно.

Пример:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

мышление

не Первый повернуть назад, то каждый Dfs текущего символа местоположения (вы можете использовать массив флагов)
здесь я назначен непосредственно на борт «», записной ДФС закончил восстановить исходное значение на
каждом этапе сравнения текущей позиции судьи и трансграничного характер, равно слову символ , соответствующий позиции
после нахождения глобального флага устанавливается истина, делать полезную работу , чтобы предотвратить

код

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        this->board=board;
        this->word=word;
        this->mx=board.size();
        this->my=board[0].size();
        this->find=false;
        for(int i=0;i<mx;++i){
            for(int j=0;j<my;++j){
                if(dfs(i,j,0))return true;
            }
        }
        return false;
    }
private:
    bool dfs(int x,int y, int cur){
        if(cur==this->word.size()){
            this->find=true;
            return true;
        }
        if(x<0||x>=this->mx||y<0||y>=this->my||this->board[x][y]!=this->word[cur]){
            return false;
        }
        if(find){
            return true;
        }
        char tmp=board[x][y];
        board[x][y]=' ';
        if(dfs(x-1,y,cur+1)||dfs(x,y-1,cur+1)||dfs(x,y+1,cur+1)||dfs(x+1,y,cur+1)){
            find=true;
            board[x][y]=tmp;
            return true;
        }
        board[x][y]=tmp;
        return false;
    }
    vector<vector<char>>board;
    string word;
    int mx,my;
    bool find;
};

рекомендация

отwww.cnblogs.com/dionysun/p/12019692.html