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 ...
随机推荐
- 视频播放-videojs
视频播放-video-js组件 安装 yarn add video.js --save npm install video.js --save 代码 import React, { useEffect ...
- 微软出品自动化神器【Playwright+Java】系列(十二)测试框架的设计与开发
一.前言 大家好,我是六哥! 又有好长一段时间没更文了,不是我懒,而是确实在更文上,没有以前积极了,这里是该自我检讨的. 其实不是我不积极,而是相对更文学习来说,优先级不是最高. 对我而言,目前最重要 ...
- Redis与Kafka的区别
第一: Kafka与Redis PUB/SUB之间较大的区别在于Kafka是一个完整的系统,而Redis PUB/SUB只是一个套件(utility)--没有冒犯Redis的意思,毕竟它的主要功能并不 ...
- SpringBoot——入门及原理
SpringBoot 用来简化 Spring应用开发,约定大于配置,去繁从简,是由 Pivotal团队提供的全新框架.其设计目的是用来简化新 Spring应用的初始搭建以及开发过程.该框架使用了特定的 ...
- ShardingSphere 数据分片之 Sharding-JDBC 深入理解
更多内容,前往 IT-BLOG MySQL 的存储单位是 page[16kb],索引使用 B+Tree,深度为3(3次 IO便能查出数据).为了提高查询速度,存储单元中都存储的是索引的指针.MySQL ...
- springsecurity-jwt整合
2 springsecurity-jwt整合 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/jwt 2.1整合springse ...
- 我和 chatGPT 对线操作系统!
大家都知道现在 chatGPT 已经在多个领域展现了及其强大的工地,比如文案策划,毕业论文方便,甚至很多程序员都直接让 chatGPT 帮忙写代码了,在一些模板化的代码方面,chatGPT 更展示了优 ...
- Thread 线程中的 Synchronized block and lock
Thread Definition of Synchronized Synchronized block in java are marked with the synchronized keywor ...
- TOP使用参数
TOP使用参数top是检查机器当前运行状况的第一个命令,就好比是机器体检时的第一张报告单.先了解一下TOP命令的使用 [root@localhost /]# top -help top: procps ...
- 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习
其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维. RuntimeError: only batches of spatial targets supp ...