2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除相关的知识,希望对你有一定的参考价值。
2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数
因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。
字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符
但不改变剩余字符相对位置的一个新字符串。
输入: s = “abc”。
输出: 7。
答案2022-10-01:
dp[0~25],保存26个字母结尾的子序列个数。
时间复杂度:O(N)。
空间复杂度:O(1)。
代码用rust编写。代码如下:
use std::collections::HashMap;
fn main()
let ans = distinct_subseq_ii("bccaccbaabbc");
println!("ans = ", ans);
let ans = zuo("bccaccbaabbc");
println!("ans = ", ans);
fn distinct_subseq_ii(s: &str) -> i32
if s.len() == 0
return 0;
let m = 1000000007;
let str2: Vec<u8> = s.bytes().collect();
// a -> 0 ->
// b -> 1 ->
// c -> 2 ->
// z -> 25 ->
// count[i] = 0
let mut count = [0; 26];
//
let mut all = 1; // 算空集
for x in str2.iter()
// x
// 纯新增
// add = all - count[x]
// all += add
// count[x] + add
let add = (all - count[(*x - 'a' as u8) as usize] + m) % m;
all = (all + add) % m;
count[(*x - 'a' as u8) as usize] = (count[(*x - 'a' as u8) as usize] + add) % m;
// 去掉!
return all - 1;
fn zuo(s: &str) -> i32
if s.len() == 0
return 0;
let m = 1000000007;
let str2: Vec<u8> = s.bytes().collect();
let mut map: HashMap<u8, i32> = HashMap::new();
let mut all = 1; // 一个字符也没遍历的时候,有空集
for x in str2.iter()
let new_add = all;
// int curAll = all + newAdd - (map.containsKey(x) ? map.get(x) : 0);
let mut cur_all = all;
cur_all = (cur_all + new_add) % m;
cur_all = (cur_all
- if map.contains_key(x)
*map.get(x).unwrap()
else
0
+ m)
% m;
all = cur_all;
map.insert(*x, new_add);
return all - 1;
执行结果如下:
以上是关于2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除的主要内容,如果未能解决你的问题,请参考以下文章
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。