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;
}

执行结果如下:


左神java代码

2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除的更多相关文章

  1. py-统计一个矩阵中每一列的非0数的个数

    1.文件类型类似于这样: 不过数据量比这个要更大一点. 2.对应上述数据的运行结果: import matplotlib.pyplot as plt with open('test.txt') as ...

  2. 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)

    引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...

  3. matlab计算矩阵每列非0元素个数

    在统计分析中,有时候需要计算矩阵每列非0元素的个数,可以用以下方法: 先用find找到每列不为0的元素index,然后用count计数. 假设有矩阵A[M,N], 结果存在countZeros cou ...

  4. 给定一个公式字符串用java进行拆解并计算结果

    需求很简单,给定一个字符串形式的公式规则,用java代码进行拆解,并能计算出结果. ♦考虑字符串中数字格式[整数.小数点] ♦考虑字符串中运算符[+-*/()] ♦考虑空格.运算规则[被0除] 以下是 ...

  5. 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

    // 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...

  6. 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

    开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...

  7. js字符串长度计算(一个汉字==两个字符)和字符串截取

    js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\ ...

  8. 给定一个字符串,仅由a,b,c 3种小写字母组成。

    package com.boco.study; /** * 题目详情 给定一个字符串,仅由a,b,c 3种小写字母组成. 当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出 ...

  9. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  10. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

随机推荐

  1. app工程目录结构

    一.APP工程目录结构 APP工程分为两个层次,第一个层次是项目(这里在eclipse中是指workspace),另一个层次是模块(这里在eclipse中是指project) 模块依附于项目,每个项目 ...

  2. python requests 上传文件_python3使用requests上传文件,content-type踩的坑

    通常提交普通表单时,requests的post方法可以指定headers,所以我在使用requests模拟上传文件行为时,直接按照下面的方式写了: 然后服务器就报出了找不到分隔符Invalid mul ...

  3. 白鹭egret 控制屏幕方向

    this.stage.orientation=fangxiang; fangxiang值: portrait landscape auto

  4. 个人数据保全计划:(2) NAS基础知识

    前言 距离去年国庆入手了NAS至今有好几个月时间了,NAS折腾起来有点麻烦,且实际作用因人而异,并没有想象中的好用,所以说好的这个系列一直没有更新~ 还有另一方面的原因,这些NAS的系统基于Linux ...

  5. 利用Intent在两个页面之间进行传值操作的具体实现

    不知道为什么,我本来使用的呼声最高的Bundle发送,但是我使用它会显示不出来,由于时间问题,我今天就先不找了,先放一下,先以完成任务为己任哈! 我们都清楚,我们基本上都是用的Intent实现的页面之 ...

  6. Android笔记--事务处理+数据库版本升级

    事务处理 beginTransaction:开始事务的标志 setTransactionSuccessful:事务成功的标志 endTransaction:结束事务的标志 在上面的图片里面,首先进行事 ...

  7. 《操作系统导论》读书笔记1——CPU虚拟化,进程

    系列文章目录和关于我 一丶CPU的虚拟化 一个桃子,我们称之为物理(physical)桃子.但有很多想吃这个桃子的 人,我们希望向每个想吃的人提供一个属于他的桃子,这样才能皆大欢喜.我们把给每个 人的 ...

  8. Eclipse安装和配置环境教程(图文详解)

    前言 在上一篇文章中,壹哥给大家介绍了Notepad++这个更高级点的记事本,它进行Java开发相比windows自带的记事本要更方便一些.但是即便如此,用这种记事本进行Java开发效率依然很低.如果 ...

  9. 在react中使用wangEditorV5

    wangEditor是基于JavaScript和css的一款web富文本编辑器,是国内比较好用的一款轻量级富文本编辑器,上手简单,易用且开源免费. 官方文档:http://www.wangeditor ...

  10. 【Java SE】多线程

    1.1 线程的生命周期 ![](file://D:\资料\学习笔记\Java\多线程\1.png?msec=1648087619803) 方法名 说明 yield() stop() sleep() w ...