仅用两个长度为1到10的字母生成所有字符串

Generating all strings by only two letters having length from 1 to 10?

本文关键字:字符串 两个      更新时间:2023-10-16

我想生成长度从1到10的所有字符串,仅按顺序排列单词'4'和'7'

  example-> 1)4 //first string
            2)7 //second string
            3)44 //third,because next after 7 should be 44
            4)47 //fourth,after 44
            . . .
            . . .
            . . .
            This way till length <=10

我自己试过了,我的回溯代码看起来像这样

        #include<bits/stdc++.h>
        using namespace std;
        vector<string>v;                // for storing intermediate string in backtracking
        void generate(string s,char ch)
        {
            if(s.length()>=9)return;    //length > 10 returning
            s+=ch;                      //adding to string a new character
            v.push_back(s);                    //storing strings
            generate(s,'4');            //first backtracking
            generate(s,'7');            //second backtracking
        }
        int main()
        {
        generate("",'4');
        sort(v.begin(),v.end());     //sorting  to get ascending order string
        string thisfind;             //to find postion of string thisfind in vector...like postion of '4' is 1
        cin>>thisfind;
        int l=find(v.begin(),v.end(),thisfind)-v.begin();  //just usual find function
        cout<<l+1<<endl;            //output
        return 0;
    }

这是不正确的,请提出一个回溯算法来做同样的

注意:-不用担心时间复杂度

不需要回溯,因为存在一个非常简单的算法,总是做正确的事情:

  • 以空字开头。(因为你要求长度> 0,所以不需要打印)

  • 在完成大小为n - 1的工作之后,您可以通过:

    • 打印每个n - 1大小的前缀为"4"的单词
    • 然后打印每个大小为n - 1的单词,前缀为"7"

因为你所做的每一次移动都保证朝着正确的方向移动(即使是在一个实际上没有显式存储任何东西的递归实现中),这并不是真正的回溯——但是你为什么要回溯呢?

注::该算法是最优的:它打印每个字符花费O(1)时间。

我在给自己的问题写答案。我花了一些时间才找到了解决办法。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define ll long long int
vector<ll> v;
void recurse(ll num)
{
    v.push_back(num);
    if (num > ((ll)10e10))
        return;
    recurse(num * 10 + 4);
    recurse(num * 10 + 7);
}
int main()
{
    recurse(0);
    sort(v.begin(), v.end());
    ll n;
    cin >> n;
    cout << find(v.begin(),v.end(),n)-v.begin()<< endl;
    return 0;
}

已经提出了更好的算法,但是我认为分享这个会很好。