首页 > 其他分享 >LeetCode: 306. Additive Number

LeetCode: 306. Additive Number

时间:2022-12-05 18:00:22浏览次数:70  
标签:arr Additive string sequence 306 num len return LeetCode


LeetCode: 306. Additive Number

题目描述

Additive number is a string whose digits can form additive sequence.

A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.

Given a string containing only digits ​​'0'-'9'​​, write a function to determine if it’s an additive number.

Note: Numbers in the additive sequence cannot have leading zeros, so sequence ​​1, 2, 03​​​ or ​​1, 02, 3​​ is invalid.

Example 1:

Input: "112358"
Output: true
Explanation: The digits can form an additive sequence: 1, 1, 2, 3, 5, 8.
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8

Example 2:

Input: "199100199"
Output: true
Explanation: The additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199

Constraints:

  • ​num​​​ consists only of digits ​​'0'-'9'​​.
  • ​1 <= num.length <= 35​

Follow up:
How would you handle overflow for very large input integers?

解题思路 —— 深度优先搜索

  1. 题目中提到数字可能越界,因此需要自己实现 大数加法
  2. 深度优先搜索遍历所有情况,判断是否存在满足题意的组合。
  3. 需要注意,每个组合的数字不能有前置 ​​0​

AC 代码

// 翻转 num
func reverse(num []byte) [] byte{
for i, j := 0, len(num)-1; i < j; i, j = i+1, j-1 {
num[i], num[j] = num[j], num[i]
}
return num
}

// 计算 lhv + rhv
func addNumber(lhv, rhv string) string {
var ans []byte
carry := 0

for i, j := (len(lhv)-1), (len(rhv)-1); i >= 0 || j >= 0 ||
carry != 0; i, j = i-1, j-1 {

if i >= 0 { carry += int(lhv[i] - '0') }
if j >= 0 { carry += int(rhv[j] - '0') }

ans = append(ans, byte(carry % 10) + '0')
carry /= 10
}

return string(reverse(ans))
}

// 判断数组中的元素是否是 "Additive Numbers"
func judge(arr []string) bool {
if len(arr) < 3 { return false }

for i := 0; i < len(arr) - 2; i++{
if addNumber(arr[i], arr[i+1]) != arr[i+2] {
return false
}
}

return true
}

// 深度优先搜索查找合适的组合
func dfs(num string, arr[] string) bool {
if len(num) == 0 {
return judge(arr)
}

for i := 1; i <= len(num); i++{
// 过滤非 ‘0’ 的前置 ‘0’
if i != 1 && num[0] == '0' { break }

arr = append(arr, num[0:i])
if dfs(num[i:], arr) {
return true
}
arr = arr[:len(arr)-1]
}

return false
}

func isAdditiveNumber(num string) bool {
return dfs(num, []string{})
}


标签:arr,Additive,string,sequence,306,num,len,return,LeetCode
From: https://blog.51cto.com/u_15903085/5913225

相关文章

  • LeetCode: 307. Range Sum Query - Mutable
    LeetCode:307.RangeSumQuery-Mutable题目描述Givenanintegerarraynums,findthesumoftheelementsbetweenindices​​i​​​and​​j(i≤j)​​,i......
  • #yyds干货盘点# LeetCode程序员面试金典:字符串轮转
    题目:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。示例1:输入:s1="waterbottle",s2="erbottlewat......
  • [LeetCode] 2256. Minimum Average Difference
    Youaregivena 0-indexed integerarray nums oflength n.The averagedifference oftheindex i isthe absolute difference betweentheaverageoft......
  • LeetCode:NO.242有效的字母异位词
    题目链接代码随想录LeetCode 题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相......
  • leetcode_D5_67二进制求和
    1.题目  2.解一  主要思路:自己的解法,主要思路就是先给短的字符串前面补0,然后把两个字符串逐位加起来,再依次判断,如果=2就减去2,然后下一位+1。写的过于繁琐了。3.......
  • leetcode 1774. 最接近目标价格的甜点成本
    1774.最接近目标价格的甜点成本难度中等133收藏分享切换为英文接收动态反馈你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制......
  • leetcode 101. 对称二叉树 js实现
    给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树......
  • leetcode 6256. 将节点分成尽可能多的组 二分图判定+bfs+并查集
    6256.将节点分成尽可能多的组难度困难7收藏分享切换为英文接收动态反馈给你一个正整数 n ,表示一个 无向 图中的节点数目,节点编号从 1 到 n 。同时给你一个......
  • #yyds干货盘点# LeetCode程序员面试金典:零矩阵
    题目:编写一种算法,若M×N矩阵中某个元素为0,则将其所在的行与列清零。 示例1:输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]]示例2:输入:[......
  • 力扣 leetcode 209. 长度最小的子数组
    问题描述给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsl,numsl+1,...,numsr-1,numsr],并返......