有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 。
你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打开保险箱。
举个例子,假设密码是 "345",你可以输入 "012345" 来打开它,只是你输入了 6 个字符.
请返回一个能打开保险箱的最短字符串。
示例1:
输入: n = 1, k = 2
输出: "01"
说明: "10"也可以打开保险箱。
示例2:
输入: n = 2, k = 2
输出: "00110"
说明: "01100", "10011", "11001" 也能打开保险箱。
提示:
n 的范围是 [1, 4]。
k 的范围是 [1, 10]。
k^n 最大可能为 4096。
思路:好久没写欧拉回路相关的题了,没看出来隐含的突破口。。。导致浪费了大把时间在搜索剪枝上,关于欧拉回路的知识我不过多赘述了,贴一下官方题解的说法,讲得很好:官方题解
class Solution {
private Set<String> st;
private StringBuilder str;
public String crackSafe(int n, int k) {
if(n==1 && k==1) return "0";
st=new HashSet<>();
str=new StringBuilder();
StringBuilder s=new StringBuilder();
for(int i=0;i<n-1;i++)
s.append("0");
String start=s.toString();
dfs(start,k);
str.append(start);
return str.toString();
}
private void dfs(String s,int k) {
for(int i=0;i<k;i++) {
String tmp=s+i;
if(!st.contains(tmp)) {
st.add(tmp);
dfs(tmp.substring(1),k);
str.append(i);
}
}
}
}