仅用两个长度为1到10的字母生成所有字符串
Generating all strings by only two letters having length from 1 to 10?
我想生成长度从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;
}
已经提出了更好的算法,但是我认为分享这个会很好。
相关文章:
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 这两个C++语句连接字符串有什么区别?
- 两个字符串之间的数学运算
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 如何在 main 函数中输出两个新字符串C++?
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)