首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数因为结果可能很大,所以返回答案需要对 10^9 +

2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数因为结果可能很大,所以返回答案需要对 10^9 +

作者头像
福大大架构师每日一题
发布2022-11-06 10:21:10
发布2022-11-06 10:21:10
4060
举报

2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数

因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。

字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符

但不改变剩余字符相对位置的一个新字符串。

输入: s = "abc"。

输出: 7。

答案2022-10-01:

dp[0~25],保存26个字母结尾的子序列个数。

时间复杂度:O(N)。

空间复杂度:O(1)。

代码用rust编写。代码如下:

代码语言:javascript
复制
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;
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_07_2_week/Code01_DistinctSubseqValue.java)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档