子串和子序列

简明:

子串:原序列中必须连续的一段

子序列:原序列中可以不连续的一段

KMP算法是求子串的算法,动态规划可以求子串或者子序列。

举例说明:

//给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
//
// 示例 1:
// 输入: "abcabcbb"
//输出: 3
//解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
//
// 示例 2:
// 输入: "bbbbb"
//输出: 1
//解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
//
// 示例 3:
// 输入: "pwwkew"
//输出: 3
//解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
//请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这道题可以使用动态规划的思想来解决。设 $dp_i$ 表示以第 $i$ 个括号为结尾的满足要求的数量,则有: - 当第 $i$ 个括号为 "(" 时,$dp_i=0$,因为以 "(" 结尾的无法满足要求。 - 当第 $i$ 个括号为 ")" 时,考虑其前一个括号的情况: - 如果前一个括号为 "(", 则可以与其匹配,此时 $dp_i=dp_{i-2}+2$。 - 如果前一个括号为 ")", 若其能与前面的 "(" 匹配,则需要找到与其匹配的 "(" 的前一个括号,此时 $dp_i=dp_{i-1}+2+dp_{i-dp_{i-1}-2}$。 最终的答案即为 $dp$ 数组中的最大值。 以下是 Python 代码实现: ### 回答2: 给定一个仅由英文符号“(”和“)”构成的括号序列,我们需要求出满足要求的非空数量。 满足要求的括号序列是指: ① 可以构成匹配的括号序列,即每个 "(" 能唯一匹配一个 ")"。 ② 一对匹配的 "(" 必须出现在对应的 ")" 之前。 思路: 我们可以通过遍历括号序列,使用一个栈来记录 "(" 的出现位置。对于遇到的每个 ")",我们计算当前位置与栈顶元素的差值,即为一个满足要求的的长度。 具体步骤: 1. 初始化一个空栈。 2. 初始化一个变量 count,用于记录满足要求的数量。 3. 遍历括号序列中的每个字符。 4. 如果当前字符为 "(" ,将其索引位置压入栈中。 5. 如果当前字符为 ")" 且栈不为空,弹出栈顶元素,计算当前位置与栈顶元素的差值并加1,将结果加到 count 中。 6. 返回 count 的值。 以下是示例代码: ```python def count_substrings(parentheses): stack = [] # 使用栈来记录 "(" 的索引位置 count = 0 # 记录满足要求的数量 for i in range(len(parentheses)): if parentheses[i] == "(": stack.append(i) elif parentheses[i] == ")" and stack: start_index = stack.pop() count += (i - start_index + 1) return count ``` 通过以上方法,我们可以快速求得满足要求的非空数量。 ### 回答3: 对于给定的括号序列,我们可以使用动态规划的思想来求解满足要求的非空数量。 定义一个数组dp,其中dp[i]表示以第i个位置作为结尾的满足要求的的数量。 对于序列的每个位置i,我们检查它之前的字符j,如果当前字符为")",则我们需要找到符合要求的最近的"(",即在范围[j,i-1]中寻找最右边的"("位置k。 如果找到了"(",则dp[i] = dp[i-1] + (i - k + 1),即以第i个位置结尾的满足要求的的数量等于以第i-1个位置结尾的满足要求的的数量加上新找到的符合要求的的数量。 如果没有找到"(",则dp[i] = 0,即以第i个位置结尾的满足要求的的数量为0。 最后,我们将dp数组中所有位置的值相加即可得到满足要求的非空数量。 例如,对于括号序列"()(()())",对应的dp数组为[0, 0, 0, 2, 4, 4, 8, 16],则满足要求的非空数量为16。 需要注意的是,dp数组的大小应该比括号序列的长度多1,即dp数组的长度为n+1,其中n为括号序列的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值