2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个
2022-11-30:小红拿到了一个仅由r、e、d组成的字符串
她定义一个字符e为"好e" : 当且仅当这个e字符和r、d相邻
例如"reeder"只有一个"好e",前两个e都不是"好e",只有第三个e是"好e"
小红每次可以将任意字符修改为任意字符,即三种字符可以相互修改
她希望"好e"的数量尽可能多
小红想知道,自己最少要修改多少次
输入一个只有r、e、d三种字符的字符串
长度 <= 2 * 10^5。
输出最小修改次数。
来自网易。
答案2022-11-30:
动态规划。
奇数,1,3,5,7一定是e。
代码用rust编写。代码如下:
use std::iter::repeat;
fn main() {
let str = "rrredrr";
let ans = min_cost(str); //dereder
println!("ans = {}", ans);
}
fn min_cost(str: &str) -> i32 {
let n = str.len() as i32;
if n < 3 {
return -1;
}
let mut arr: Vec<i32> = repeat(0).take(n as usize).collect();
// d认为是0,e认为是1,r认为是2
let strc: Vec<char> = str.chars().collect();
for i in 0..n {
let cur = strc[i as usize];
if cur == 'd' {
arr[i as usize] = 0;
} else if cur == 'e' {
arr[i as usize] = 1;
} else {
arr[i as usize] = 2;
}
}
// 通过上面的转化,问题变成了:
// 1的左右,一定要被0和2包围,这个1才是"好1"
// 请让"好1"的尽量多,返回最少的修改代价
let mut max_good = 0;
let mut min_cost = i32::MAX;
for prepre in 0..3 {
for pre in 0..3 {
let mut cost = if arr[0] == prepre { 0 } else { 1 };
cost += if arr[1] == pre { 0 } else { 1 };
let cur = process(&mut arr, 2, prepre, pre);
if cur.max_good > max_good {
max_good = cur.max_good;
min_cost = cur.min_cost + cost;
} else if cur.max_good == max_good {
min_cost = get_min(min_cost, cur.min_cost + cost);
}
}
}
return min_cost;
}
fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
}
struct Info {
max_good: i32,
min_cost: i32,
}
impl Info {
fn new(a: i32, b: i32) -> Self {
Self {
max_good: a,
min_cost: b,
}
}
}
// 暴力递归
// 可以自己改成动态规划
// arr[index-2]位置的数值是prepre
// arr[index-1]位置的数值是pre
// 在这种情况下,请让arr[index...]上的好1尽量多
// 返回:
// 尽量多的"好1",是多少?
// 得到尽量多的"好1",最小代价是多少?
fn process(arr: &mut Vec<i32>, index: i32, prepre: i32, pre: i32) -> Info {
if index == arr.len() as i32 {
return Info::new(0, 0);
}
// 可能性1,arr[index],变成0
let mut p1_value = if prepre == 2 && pre == 1 { 1 } else { 0 };
let mut p1_cost = if arr[index as usize] == 0 { 0 } else { 1 };
let mut info = process(arr, index + 1, pre, 0);
p1_value += info.max_good;
p1_cost += info.min_cost;
// 可能性2,arr[index],变成1
let mut p2_value = 0;
let mut p2_cost = if arr[index as usize] == 1 { 0 } else { 1 };
info = process(arr, index + 1, pre, 1);
p2_value += info.max_good;
p2_cost += info.min_cost;
// 可能性3,arr[index],变成2
let mut p3_value = if prepre == 0 && pre == 1 { 1 } else { 0 };
let mut p3_cost = if arr[index as usize] == 2 { 0 } else { 1 };
info = process(arr, index + 1, pre, 2);
p3_value += info.max_good;
p3_cost += info.min_cost;
// 开始决策,选出三种可能性中的最优解
let mut max_good = 0;
let mut min_cost = i32::MAX;
if p1_value > max_good {
max_good = p1_value;
min_cost = p1_cost;
} else if p1_value == max_good {
min_cost = get_min(min_cost, p1_cost);
}
if p2_value > max_good {
max_good = p2_value;
min_cost = p2_cost;
} else if p2_value == max_good {
min_cost = get_min(min_cost, p2_cost);
}
if p3_value > max_good {
max_good = p3_value;
min_cost = p3_cost;
} else if p3_value == max_good {
min_cost = get_min(min_cost, p3_cost);
}
return Info::new(max_good, min_cost);
}
执行结果如下:

2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个的更多相关文章
- php 除10取整,取十位数前面一个数字,百位前两个数字
需求:php 除10取整,取十位数前面一个数字,百位前两个数字,并把大于2的加红显示 例:0-9,10-19,20-29,30-39,110-119对应为:0 1 2 3 11 实现主要方法:$num ...
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...
- Js 正则表达式 写了一个正整数或小数点或分数前两个正则表达式
写了一个正整数或小数点或分数前两个正则表达式 /^[0-9]+([.]{1}[0-9]{1,2})? $/ 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
前言:前两篇转载别人的精彩文章,自己也总结一下吧! 最近又开始用起py,是为什么呢? 自己要做一个文本相似度匹配程序,大致思路就是两个文档,一个是试题,一个是材料,我将试题按每题分割出来,再将每题的内 ...
- 用mvc模式,整理前两次的代码并增加登陆注册
简单的servlet连接mysql数据库 使用mvc的登录注册 commons-dbutils-1.6 mysql-connector-java-5.1.40-bin c3p0-0.9.5.2 mch ...
- Week08_day01 (Hive开窗函数 row_number()的使用 (求出所有薪水前两名的部门))
数据准备: 7369,SMITH,CLERK,7902,1980-12-17,800,null,20 7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30 7 ...
- 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
GDB的那些奇淫技巧 evilpan 收录于 Security 2020-09-13 约 5433 字 预计阅读 11 分钟 709 次阅读 gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...
- jsoi2014前两轮回眸
今天从常州回来了,第二轮考得惨不忍睹 大概来总结一下前两轮: 第一轮是4个小时,3道题,一道网络流,一道环形DP,一道线段树 最后一道题ahoi的原题(传送bzoj1798),非常水的线段树,是个很好 ...
- JavaBean的属性变量名前两个字母大小写问题
Java属性命名规范! 一般情况下.Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等), ...
- table固定前两列和最后一列,其他滑动显示
网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个table的,此示例只固定了前两列和最后一列,和网上的不太一样. 网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个tab ...
随机推荐
- PHP精度计算函数
bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1 bcdiv - 将两个高精度数字相除 bcmod - 求高精度数字余数 bcmul - 将两个高精度数 ...
- TortoiseGit自动保存用户名和密码
在使用TortoiseGit上传时,会多次提示输入用户名和密码,采用以下方法解决 1.桌面点击右键 -> 选择TortoiseGit -> 点击settings 2.点击选择Git 3.点 ...
- supervisor不一样的日志轮转
出于项目需求,需要读取某个进程的最新日志,而这个进程刚好是supervisor管控. 很自然地我就想到了,根据日志的编辑时间排序,获取最新的日志文件. 然而,发现了奇怪的一幕: 发现什么没有? web ...
- 修改linux服务器时间
date -s "20220104 11:07:05" &&hwclock --systohc
- [jointjs] 端口(port)
关于端口,我也不知道怎么解释,就用joint官网的这句话先打个头. Many diagramming applications deal with the idea of elements with ...
- vulnhub靶场之HARRYPOTTER: ARAGOG (1.0.2)
准备: 攻击机:虚拟机kali.本机win10. 靶机:HarryPotter: Aragog (1.0.2),下载地址:https://download.vulnhub.com/harrypotte ...
- 基于Kafka和Elasticsearch构建实时站内搜索功能的实践
作者:京东物流 纪卓志 目前我们在构建一个多租户多产品类网站,为了让用户更好的找到他们所需要的产品,我们需要构建站内搜索功能,并且它应该是实时更新的.本文将会讨论构建这一功能的核心基础设施,以及支持此 ...
- HDFS 组织架构
一.HDFS 概述 HDFS 产生背景:随着数据量越来越多,一个系统存储不下所有的数据,那么就需要分配到多个操作系统的磁盘中进行存储,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就 ...
- Synchronized和Volatile的对比
Synchronized和Volatile是并发中的两大关键字,有相似性和不同点. Synchronized更详细介绍参考https://www.cnblogs.com/spark-cc/p/1706 ...
- Service Mesh之Istio基础入门
技术背景 分布式服务治理 所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理:管控及管理包含网络拓扑变动.网络延时.通信安全.API网关.服务注册和发现.服务熔断容错.服务超时重试.服务部署.数 ...