2022-09-01:字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。 给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波
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;
}
执行结果如下:

2022-09-01:字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。 给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波的更多相关文章
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 随机生成长度为len的密码,且包括大写、小写英文字母和数字
一道华三面试题,随机生成长度为len的密码,且包括大写.小写英文字母和数字,主要Random类的使用,random.nextInt(len)表示生成[0,len)整数.具体实现见下面代码,已经很详细了 ...
- 定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素, 添加另一个集合,删除元素,判断集合中是否包含一个元素, 判断是否为空,清除集合, 返回集合里元素的个数等常用操作。
package com.lanxi.demo2; import java.util.HashSet; import java.util.Iterator; import java.util.Set; ...
- java 正则表达式 验证字符串 只包含汉字英文数字
String content = “testContent”; String regex="^[a-zA-Z0-9\u4E00-\u9FA5]+$"; Pattern patter ...
- php实现 删除字符串中出现次数最少的字符
php实现 删除字符串中出现次数最少的字符 一.总结 一句话总结:数组排序是改变数组的,而其它函数一般不改变原数据,比如str_replace(); 1.单案例测试通过而多案例测试不通过怎么办? 检 ...
- SDUT OJ 2892 A (字典树问题-输出出现次数最多的字符串的出现次数,60ms卡时间,指针+最后运行完释放内存)
A Time Limit: 60ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给出n(1<= n && n <= 2*10^6)个字 ...
- 算法基础:删除字符串中出现次数最少的字符(Golang实现)
描写叙述: 实现删除字符串中出现次数最少的字符.若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串. 字符串中其他字符保持原来的顺序. 输入: 字符串仅仅包括小写英文字母, 不考虑非法输入, ...
- Java经典案例之-“统计英文字母、空格、数字和其它字符的个数”
/** * 描述:输入一行字符串,并且统计出其中英文字母.空格.数字和其它字符的个数. * 分析:利用for语句,条件为输入的字符不为 '\n ' * 作者:徐守威 */ package com.xu ...
- 限制<input>输入内容 只允许数字 或者 字母
只能输入数字: 有回显 <input onkeyup="value=value.replace(/[^\d]/g,'')"> 只能输入数字:无回显 <input ...
随机推荐
- instanceof与类型转换
instanceof与类型转换 package com.andy.base.oop.demo01.demo06; public class Teacher extends Person { } pac ...
- 深入理解 Python 虚拟机:整型(int)的实现原理及源码剖析
深入理解 Python 虚拟机:整型(int)的实现原理及源码剖析 在本篇文章当中主要给大家介绍在 cpython 内部是如何实现整型数据 int 的,主要是分析 int 类型的表示方式,分析 int ...
- MySQL学习(十一)为什么不推荐使用uuid和雪花id
参考博客:https://www.cnblogs.com/wyq178/p/12548864.html 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面.当达到页面的最大填充 ...
- Javacv 音视频小工具 - 下载抖音视频
一.前言 大家好,俗话说的好,学习新的知识后要学以致用,在学习音视频的过程中,你有没有疑问,不知道音视频可以用来做什么.下面举几个例子,比较耳熟能详,被吹到风口的一些场景有:AI 视觉计算, AI 人 ...
- 什么是UV贴图和展开?
转载:https://baijiahao.baidu.com/s?id=1673723122020029798&wfr=spider&for=pc UV贴图是用于轻松包装纹理的3D模型 ...
- java多线程基础小白指南--synchronized同步块
sychronized是java多线程非常关键的一个知识点,这篇博客将从synchronized几个用法以及代码来学习. sychronized的作用是能够保证同一时间只有一个线程来运行这块代码,达到 ...
- 网络图片的爬取和存储.py(亲测有效)
import requests import os url = "https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/i ...
- python入门教程之八列表,字典,字符串,集合常用操作
一列表常用方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表元素最大值 4 mi ...
- kali 安装beef-xss (含输入正确密码却登录不了本机无法打开beef提示找不到服务器404常见解决办法)
1:安装beef 2:修改配置文件 3:浏览器打开地址127.0.0.1:3000/ui/panel 常见问题解决本文最后 kali 打开终端 输入apt-get install beef-xss - ...
- LeeCode链表问题(一)
本文中所使用的链表定义如下所示: # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next ...