LeetCode---回溯法(全排列)

Posted Fflyqaq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode---回溯法(全排列)相关的知识,希望对你有一定的参考价值。




#46 全排列

https://leetcode-cn.com/problems/permutations/submissions/

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

class Solution {
public:

vector<vector<int>> result;
vector<int> temp;
int flag[1000] = {0};

vector<vector<int>> permute(vector<int>& nums)
{
    Dfs(nums,0,nums.size());

    return result;
}

void Dfs(vector<int>& nums,int index,int length)
{
	//退出条件
    if(index >= length){
        result.push_back(temp);
        return;
    }

	//回溯
    for(int i=0;i<length;i++){
        if(!flag[i]){
            temp.push_back(nums[i]);
            flag[i] = 1;
            Dfs(nums,index+1,length);
            temp.pop_back();
            flag[i] = 0;
        }
    }
}

};

#1415 长度为 n 的开心字符串中字典序第 k 小的字符串

https://leetcode-cn.com/problems/the-k-th-lexicographical-string-of-all-happy-strings-of-length-n/


class Solution {
public:

//判断到了第几个
int cnt = 0;
//中间字符串
string temp;
//需要返回第k个字符串
string ret;

void Dfs(int n,int k,int index)
{
    //超过第k个,退出
    if(cnt >= k){
        return ;
    }


    //超过字符串最大位数,退出
    if(index == n){
        cnt++;
        ret = temp;
        cout<<ret<<endl;
        return ;
    }


    //回溯
    for(int i = ‘a‘;i<=‘c‘;i++){
        //限定条件
        if(index && temp.back() ==i){
            continue;
        }

        temp.push_back(i);
        Dfs(n,k,index+1);
        temp.pop_back();
    }
}



string getHappyString(int n, int k)
{
    Dfs(n,k,0);
    return cnt==k?ret:"";
}

};

一道之前笔试遇到的全排列题目

题目大概是:
输入n,k
比如输入123 6
求123的全排列中能被6整除的个数。

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;

char flag[11];
//判断有几个可以整除
int cnt = 0;
//中间字符串
string temp = "";

int Str2Int(string str)
{
    int ret = 0;
    for(int i=str.size()-1; i>=0; i--)
    {
        ret += (str[i]-48)*pow(10,str.size()-i-1);
    }
    return ret;
}

void Dfs(string str,int k,int index)
{
    //超过字符串最大位数
    if(index >= str.size())
    {
        cout<<temp<<endl;
        int num = Str2Int(temp);
        if(num%k==0)
            cnt++;

        return ;
    }

    int j = 0;
    //可能的值
    for(char i = str[j]; j<str.size(); i=str[++j])
    {
        if(!flag[j])
        {
            temp.push_back(i);
            flag[j] = true;
            Dfs(str,k,index+1);
            flag[j] = false;
            temp.pop_back();
        }
    }
}

int Cal(string n, int k)
{
    Dfs(n,k,0);

    return cnt;
}

int main()
{
    string str;
    int k;
    cin>>str;
    cin>>k;

    cout<<Cal(str,k);

    return 0;

}








以上是关于LeetCode---回溯法(全排列)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode46 回溯算法求全排列,这次是真全排列

leetcode 47. 全排列 II---回溯篇6

LeetCode:46. 全排列47. 全排列 II

leetcode 46. 全排列----回溯篇5

算法 ---- LeetCode回溯系列问题题解

算法 ---- LeetCode回溯系列问题题解