• 0递归中等 LeetCode306. 累加数


    306. 累加数

    描述

    累加数 是一个字符串,组成它的数字可以形成累加序列。

    一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。

    给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。

    说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

    示例 1:
    
    输入:"112358"
    输出:true 
    解释:累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
    示例 2:
    
    输入:"199100199"
    输出:true 
    解释:累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
     
    
    提示:
    
    1 <= num.length <= 35
    num 仅由数字(0 - 9)组成
     
    
    进阶:你计划如何处理由过大的整数输入导致的溢出?
    
    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/additive-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    分析

    暴力递归切分字符串,每次递归且分出一个子字符串,然后判断这个子字符串表示的数字是否等于前两个数的和。
    若是第一个第二个数不做这个判断。
    递归结束的条件当当前切分的位置已经走到num的结尾以后,仍然没有被踢退说明满足条件,返回true。

    class Solution {
        public boolean isAdditiveNumber(String num) {
            return dfs(num,0,0,0,0);
        }
    
        public boolean dfs(String num, int index, int count, long prepre, long pre) {
            if (index == num.length()) {
                if (count < 3) {
                    return false;
                }
                return true;
            }
            boolean ans = false;
            for (int i = index + 1; i <= num.length(); i++) {
                String str = num.substring(index,i);
                if (str.length() > num.length() / 2) {
                    break;
                }
                long cur = Long.parseLong(str);
                if (cur > 0 && num.charAt(index) == '0') {
                    continue;
                }
                if (count == 0) {
                    ans = ans || dfs(num,i,count+1,cur,0);
                } else if (count == 1) {
                    ans = ans || dfs(num,i,count+1,prepre,cur);
                } else {
                    if (cur != pre + prepre) {
                        continue;
                    }
                    ans = ans || dfs(num,i,count+1,pre,cur);
                }
                if (ans) {
                    return ans;
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    使用VsCode调试UE5的PuerTs
    使用RabbitMQ死信交换机实现延迟消息
    11、综合应用案例
    运维学习之采集器 node_exporter 1.3.1安装并使用
    【24届数字IC秋招总结】正式批面试经验汇总9——飞腾
    NTP 时间同步
    Java非Spring框架下的单元测试
    通过RSYNC在linux和windows间同步文件
    Clickhouse启动失败定位
    Day10—SQL那些事(特殊场景的查询)
  • 原文地址:https://blog.csdn.net/weixin_43260719/article/details/125490827