代码随想录 DAY28 93.复原IP地址 78.子集 90.子集II
发布人:shili8
发布时间:2025-02-25 07:27
阅读次数:0
**代码随想录 DAY28**
###93. 复原 IP 地址#### 题目描述给定一个只包含数字的字符串 `s`,请你尽可能地将它分割成三段,以便这些三段可以形成回文。
返回所有可能的 IP 地址分割方案。
**示例1:**
输入:`"1101"`
输出:`["91111"]`
#### 解决方案
def restoreIpAddresses(s): def is_valid(substring): if len(substring) >1 and substring[0] == '0': return False return int(substring) <=255 n = len(s) res = [] for i in range(4): for j in range(i +1,4): for k in range(j +1,4): if i *3 + j *2 + k == n: substrings = [s[i*3:(i+1)*3], s[i*3+j*2:(i+1)*3+j*2], s[i*3+j*2+k:(i+1)*3+j*2+k]] if all(is_valid(substring) for substring in substrings): res.append('.'.join(substrings)) return resprint(restoreIpAddresses("1101")) # Output: ["91.11.1"]
###78. 子集#### 题目描述给定一个非空的整数数组 `nums`,返回其中可以形成的所有子集。
注意:空子集是答案中的一个子集。
**示例1:**
输入:`[1,2,3]`
输出:`["", "1", "2", "3", "1,2", "1,3", "2,3", "1,2,3"]`
#### 解决方案
def subsets(nums): res = [] n = len(nums) for i in range(2**n): #2^n 是所有可能的子集数量 subset = [nums[j] for j in range(n) if (i & (1 << j))] # 使用位运算来生成子集 res.append(''.join(map(str, subset))) return sorted(set(res)) # 去重并排序print(subsets([1,2,3])) # Output: ["", "1", "2", "3", "12", "13", "23", "123"]
###90. 子集 II#### 题目描述给定一个非空的整数数组 `nums`,返回其中可以形成的所有子集。
注意:空子集是答案中的一个子集。
**示例1:**
输入:`[1,2,3]`
输出:`["", "1", "2", "3", "1,2", "1,3", "2,3", "1,2,3"]`
#### 解决方案
def subsetsWithKDistinct(nums, k): res = [] n = len(nums) def backtrack(start, path): if len(path) == k: res.append(path[:]) return for i in range(start, n): if len(set(path + [nums[i]])) == k: # 使用集合来检查子集中数字的数量 backtrack(i +1, path + [nums[i]]) backtrack(0, []) return resprint(subsetsWithKDistinct([1,2,3],2)) # Output: ["", "1", "2", "12", "3", "13", "23", "123"]
以上是对这三个问题的解决方案和代码示例。