【欧拉回路】这道题的意思就是每n个字符可以用来试一次,求能试出来的最短长度。为什么这里会有个最短长度呢,我们以n=3,k=2举例子:
3位的密码,每位上可以放0/1,那么就有2^3种可能:000,001,010,011,100,101,110,111,但是我们简单地把这些答案拼接起来,因为我们发现000和001这种后缀和前缀有很多重叠也就是只需要输入0001就可以试这两种答案了,那么如何判断这种前后关系呢。我们可以发现三个的情况是从两个的情况(00,01,10,11)通过最后一位加上0或者1转移过来的,所以可以得到下面这个状态转换图。
于是就成了把每条边都至少走一次,由于每个点都有0和1作为出度同时也有0和1作为入度,所以这个图肯定是欧拉图。
class Solution {
Set<String> set = new HashSet();
StringBuilder sb = new StringBuilder();
int n, k;
public void dfs(String s) {
for (int i = 0; i < k; i++) {
char c = (char)('0' + i);
String t = s + c;
if (set.contains(t)) continue;
set.add(t);
dfs(t.substring(1, n));
sb.append(c);
}
}
public String crackSafe(int n, int k) {
this.n = n; this.k = k;
String st = "0".repeat(n - 1);
dfs(st);
sb.append(st);
return sb.toString();
}
}