2022-09-01:字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。
给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波动 值。
子字符串 是一个字符串的一段连续字符序列。
注意:必须同时有,最多字符和最少字符的字符串才是有效的。
输入:s = “aababbb”。
输出:3。

答案2022-09-01:

方法一:自然智慧,3个for循环。
方法二:动态规划。

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

fn main() {
let s = "aababbb";
let ans = largest_variance1(s);
println!("ans = {}", ans);
let ans = largest_variance2(s);
println!("ans = {}", ans);
} fn largest_variance1(s: &str) -> i32 {
if s.len() == 0 {
return 0;
}
let n = s.len() as i32;
// a b a c b b a
// 0 1 0 2 1 1 0
let mut arr: Vec<i32> = vec![];
for _ in 0..n {
arr.push(0);
}
let sbytes=s.as_bytes();
for i in 0..n {
arr[i as usize] = (sbytes[i as usize] - 'a' as u8) as i32;
}
let mut ans = 0;
// 26 * 26 * n O(N)
for more in 0..26 {
for less in 0..26 {
if more != less {
let mut continuous_a = 0;
let mut appear_b = false;
let mut max = 0;
// 从左到右遍历,
for i in 0..n {
if arr[i as usize] != more && arr[i as usize] != less {
continue;
}
if arr[i as usize] == more {
// 当前字符是more
continuous_a += 1;
if appear_b {
max += 1;
}
} else {
// 当前字符是B
max = get_max(max, continuous_a) - 1;
continuous_a = 0;
appear_b = true;
}
ans = get_max(ans, max);
}
}
}
}
return ans;
} fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
} fn largest_variance2(s: &str) -> i32 {
if s.len() == 0 {
return 0;
}
let n = s.len() as i32;
// a b a c b b a
// 0 1 0 2 1 1 0
let mut arr: Vec<i32> = vec![];
for _ in 0..n {
arr.push(0);
}
for i in 0..n {
arr[i as usize] = (s.as_bytes()[i as usize] - 'a' as u8) as i32;
}
// dp[a][b] = more a less b max
// dp[b][a] = more b less a max
let mut dp: Vec<Vec<i32>> = vec![];
// continuous[a][b] more a less b 连续出现a的次数
// continuous[b][a] more b less a 连续出现b的次数
let mut continuous: Vec<Vec<i32>> = vec![];
// appear[a][b] more a less b b有没有出现过
// appear[b][a] more b less a a有没有出现过
let mut appear: Vec<Vec<bool>> = vec![];
for i in 0..26 {
dp.push(vec![]);
continuous.push(vec![]);
appear.push(vec![]);
for _ in 0..26 {
dp[i].push(0);
continuous[i].push(0);
appear[i].push(false);
}
}
let mut ans = 0;
// 26 * N
for i in arr.iter() {
let i = *i;
for j in 0..26 {
if j != i {
// i,j
// more i less j 三个变量 连续出现i,j有没有出现过,i-j max
// more j less i 三个变量 连续出现j,i有没有出现过,j-i max
continuous[i as usize][j as usize] += 1;
if appear[i as usize][j as usize] {
dp[i as usize][j as usize] += 1;
}
if !appear[j as usize][i as usize] {
appear[j as usize][i as usize] = true;
dp[j as usize][i as usize] = continuous[j as usize][i as usize] - 1;
} else {
dp[j as usize][i as usize] = get_max(
dp[j as usize][i as usize],
continuous[j as usize][i as usize],
) - 1;
}
continuous[j as usize][i as usize] = 0;
ans = get_max(
ans,
get_max(dp[j as usize][i as usize], dp[i as usize][j as usize]),
);
}
}
}
return ans;
}

执行结果如下:


左神java代码

2022-09-01:字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。 给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波的更多相关文章

  1. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  2. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  3. 随机生成长度为len的密码,且包括大写、小写英文字母和数字

    一道华三面试题,随机生成长度为len的密码,且包括大写.小写英文字母和数字,主要Random类的使用,random.nextInt(len)表示生成[0,len)整数.具体实现见下面代码,已经很详细了 ...

  4. 定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素, 添加另一个集合,删除元素,判断集合中是否包含一个元素, 判断是否为空,清除集合, 返回集合里元素的个数等常用操作。

    package com.lanxi.demo2; import java.util.HashSet; import java.util.Iterator; import java.util.Set; ...

  5. java 正则表达式 验证字符串 只包含汉字英文数字

    String content = “testContent”; String regex="^[a-zA-Z0-9\u4E00-\u9FA5]+$"; Pattern patter ...

  6. php实现 删除字符串中出现次数最少的字符

    php实现  删除字符串中出现次数最少的字符 一.总结 一句话总结:数组排序是改变数组的,而其它函数一般不改变原数据,比如str_replace(); 1.单案例测试通过而多案例测试不通过怎么办? 检 ...

  7. SDUT OJ 2892 A (字典树问题-输出出现次数最多的字符串的出现次数,60ms卡时间,指针+最后运行完释放内存)

    A Time Limit: 60ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给出n(1<= n && n <= 2*10^6)个字 ...

  8. 算法基础:删除字符串中出现次数最少的字符(Golang实现)

    描写叙述: 实现删除字符串中出现次数最少的字符.若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串. 字符串中其他字符保持原来的顺序. 输入: 字符串仅仅包括小写英文字母, 不考虑非法输入, ...

  9. Java经典案例之-“统计英文字母、空格、数字和其它字符的个数”

    /** * 描述:输入一行字符串,并且统计出其中英文字母.空格.数字和其它字符的个数. * 分析:利用for语句,条件为输入的字符不为 '\n ' * 作者:徐守威 */ package com.xu ...

  10. 限制<input>输入内容 只允许数字 或者 字母

    只能输入数字: 有回显 <input onkeyup="value=value.replace(/[^\d]/g,'')"> 只能输入数字:无回显 <input ...

随机推荐

  1. arcengine标注转注记

    只是将在arcmap中添加注记的方式模拟了一遍,因此,首先显示标注(Label),而后将其转换为注记(Annotation)(Convert Label To Annotation) /******* ...

  2. 服务器中VirtualBox子网访问

    本人常用的虚拟机软件是VirtualBox,由于笔记本性能,磁盘存储大下限制,以及VirtualBox客户机无法在多个设备间直接方便的使用等原因,我把几个虚拟的系统全部移动到便携式服务器中. 移动之后 ...

  3. 共享USB打印机设置方法

    打印机共享 一.准备 所有计算机在同一个网段. 所有计算机在同一个工作组,组名可以自定义,默认WORKGROUP. 使用超级管理员用户,目的是为了激活guest用户.验证之后可以不需要此前提. 二.主 ...

  4. 实验十 团队作业7:团队项目用户验收&Beta冲刺

    项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验十 团队名称 零基础619 团队成员分工描述 任务1:亚楠,桂婷任务2:团队合作任务3:团队合作任务4:荣娟,鑫 团队的课程学习目 ...

  5. kali 配置apt源、设置中文、安装googlepinyin输入法

    配置apt源地址 kali 自带的apt源是国外的,更新网速很慢,这里我设置的是中科大的源. http://mirrors.ustc.edu.cn/help/kali.html 1.复制页面的源地址 ...

  6. PicList 现已上架Mac App Store 分享下整个上架过程和遇到的问题

    PicList 是一款云存储/图床平台管理和文件上传工具,基于 PicGo 进行了深度二次开发,保留了 PicGo 的所有功能的同时,为相册添加了同步云端删除功能,同时增加了完整的云存储管理功能,包括 ...

  7. 小笨自采集在线电脑壁纸 v2.0-支持移动端自适应,支持https

    这周闲着没事,翻着网站,记得去年的发表的一篇文章小笨分享一款高清电脑壁纸API,主要是将孟坤壁纸改造支持https,还加了一个搜索功能.以前的壁纸是这样的: 但是,不支持移动端浏览,于是小笨趁着这周周 ...

  8. 大数据面试——Flink

    一.公司怎么提交的实时任务,有多少 Job Manager.TaskManager 是多少 我们使用 yarn session 模式提交任务:另一种方式是每次提交都会创建一个新的 Flink集群,为每 ...

  9. Rainbond的 Gateway API 插件制作实践

    Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...

  10. SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具)

    SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具) 搜到大部分打包exe的文章都是使用exe4j打包 步骤贼多,安装麻烦,打包麻烦 收费软件,公司使用会吃律师函 JDK14以上 ...