题目
题目链接:
https://www.nowcoder.com/practice/ff244079fdaf4d8f9767887ec9582043
思考
利用递归不断找到合适的字符串转成数值满足要求
参考答案Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr string字符串
* @return bool布尔型
*/
public boolean AdditiveArray (String arr) {
return dfs(arr, arr.length(), 0, 0, 0, 0);
}
//利用递归不断找到合适的字符串转成数值满足要求
public boolean dfs(String s, int n, int index, long sum, long pre, int k) {
if (index == n ) return k > 2; //k大于2符合题目要求
for (int i = index; i < n ; i++) {
int left = index, right = i;
if (left < right && s.charAt(left) == '0') continue;
long cur = 0;
while (left <= right) {
cur = cur * 10 + (s.charAt(left++) - '0');
}
if (k >= 2 && cur != sum) continue;
if (dfs(s, n, i + 1, cur + pre, cur, k + 1)) return true;
}
return false;
}
}
参考答案Go
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr string字符串
* @return bool布尔型
*/
func AdditiveArray(arr string) bool {
// write code here
return Dfs(arr, 0, 0, 0, 0)
}
// 利用递归不断找到合适的字符串转成数值满足要求
func Dfs(s string, index int, sum int, pre int, cnt int) bool {
if index == len(s) && cnt > 2 {
return true
}
for i := index; i < len(s); i++ {
left := index
right := i
if left < right && s[left] == '0' {
continue
}
var cursum int = 0
for left <= right {
cursum = (int)(cursum*10) + (int)(s[left]-'0')
left++
}
if cnt >= 2 && cursum != sum {
continue
}
if Dfs(s, i+1, cursum+pre, cursum, cnt+1) {
return true
}
}
return false
}
参考答案PHP
<?php
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr string字符串
* @return bool布尔型
*/
function AdditiveArray( $arr )
{
return dfs($arr,0,0,0,0);
}
//利用递归不断找到合适的字符串转成数值满足要求
function dfs($s,$index,$next,$pre,$cnt){
//var_dump('index:'.$index.' sum:'.$sum.' pre:'.$pre.' cnt:'.$cnt);
if($index == strlen($s) && $cnt >2) return true;
for($i=$index;$i<strlen($s);$i++){
$left = $index;
$right = $i;
if($left<$right && $s[$left] =='0') continue;
$cursum =0;
while ($left<=$right){
$cursum=$cursum*10+intval($s[$left++]);
}
if($cnt>=2 && $cursum !=$next) continue;
if(dfs($s,$i+1,$cursum+$pre,$cursum,$cnt+1)){
return true;
}
}
return false;
}