假设我们有一个受密码保护的盒子。密码是n位数字的序列,其中每个数字可以是前k个数字0、1,...,k-1中的一个。因此,当我们输入密码时,最后输入的n位数字将自动与正确的密码匹配。
因此,例如,假设正确的密码是“ 563”,那么如果我们输入“ 285639”,则该框将打开,因为正确的密码与输入密码的后缀匹配。我们必须找到可以保证在输入框时打开框的最小长度的任何密码。
当输入类似n = 2和k = 2时,结果可以是“ 01100”,“ 00110”,“ 10011”,“ 11001”中的任何一个。
为了解决这个问题,我们将遵循以下步骤-
定义一组称为访问的
定义一个函数dfs()
,它将取s,k,
对于初始化i:= 0,当i <k时,更新(将i增加1),执行-
将temp插入访问
temp:=从索引1到结尾获取temp的子字符串
dfs(温度,k)
ret:= ret将我连接为字符串
temp:= s将我连接为字符串
如果没有访问temp,则-
从主要方法中,执行以下操作-
如果n与1相同且k与1相同,则-
返回“ 0”
ret:=空字符串,s:=空字符串
对于初始化i:= 0,当i <n-1,更新(将i增加1)时,执行-
s:= s连接“ 0”
dfs(s,k)
对于初始化i:= 0,当i <n-1,更新(将i增加1)时,执行-
ret:= ret连接“ 0”
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: set <string> visited; string ret; string crackSafe(int n, int k) { if(n == 1 && k == 1) return "0"; ret = ""; string s = ""; for(int i = 0; i < n - 1; i++){ s += "0"; } dfs(s, k); for(int i = 0; i < n - 1; i++) ret += "0"; return ret; } void dfs(string s, int k) { string temp; for(int i = 0; i < k; i++){ temp = s + to_string(i); if(!visited.count(temp)){ visited.insert(temp); temp = temp.substr(1); dfs(temp, k); ret += to_string(i); } } } }; main(){ Solution ob; cout << (ob.crackSafe(2,2)); }
2 2
输出结果
01100