今天的每日一题用到了回溯算法,这个我不是太熟悉,最后去借鉴了题解,但是不管怎么说还是来记录一下:
回溯算法简介:
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不
满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到
目标。
题目描述:
思路:
1.我们先确定第一个数和第二个数,然后判断相加能否找到紧邻的第三个数,如果能找到则继续第四个,依
次继续
2.如果不能找到紧邻的第三个数。则删除刚刚的插入,再继续第一步。
3.特殊处理开头是0的字符串
代码实现如下:
public boolean panduan(int prev, int index, int sum, String S, ArrayList<Integer> deque){
if(index==S.length()){
return deque.size()>2;
}
long cuur_long=0L;
//尝试不同的前缀
for(int i=index;i<S.length();i++){
if(i>index && S.charAt(index)=='0'){
break;
}
cuur_long=cuur_long*10+S.charAt(i)-'0';
if(cuur_long>Integer.MAX_VALUE){
break;
}
int curr=(int)cuur_long;
//deque<2 的时候我们先确定第一个数和第二个数
if(deque.size()>=2){
//确定第一个第二个数后开始判断是否构成斐波那契数
if(curr<sum){
continue;
}else if(curr>sum){
break;
}
}
deque.add(curr);
if(panduan(curr, i+1, curr+prev,S, deque)){
return true;
}else {
//不满足进行删除
deque.remove(deque.size()-1);
}
}
return false;
}
letcode链接地址:https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence/