JAVA程序设计:破解保险箱(LeetCode:753)

有一个需要密码才能打开的保险箱。密码是 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);
    		}
    	}
    	
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值