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

执行结果如下:


左神java代码

2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个的更多相关文章

  1. php 除10取整,取十位数前面一个数字,百位前两个数字

    需求:php 除10取整,取十位数前面一个数字,百位前两个数字,并把大于2的加红显示 例:0-9,10-19,20-29,30-39,110-119对应为:0 1 2 3 11 实现主要方法:$num ...

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

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

  3. Js 正则表达式 写了一个正整数或小数点或分数前两个正则表达式

    写了一个正整数或小数点或分数前两个正则表达式 /^[0-9]+([.]{1}[0-9]{1,2})? $/ 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  4. 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!

    前言:前两篇转载别人的精彩文章,自己也总结一下吧! 最近又开始用起py,是为什么呢? 自己要做一个文本相似度匹配程序,大致思路就是两个文档,一个是试题,一个是材料,我将试题按每题分割出来,再将每题的内 ...

  5. 用mvc模式,整理前两次的代码并增加登陆注册

    简单的servlet连接mysql数据库 使用mvc的登录注册 commons-dbutils-1.6 mysql-connector-java-5.1.40-bin c3p0-0.9.5.2 mch ...

  6. 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 ...

  7. 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程

    GDB的那些奇淫技巧 evilpan 收录于 Security  2020-09-13  约 5433 字   预计阅读 11 分钟  709 次阅读  gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...

  8. jsoi2014前两轮回眸

    今天从常州回来了,第二轮考得惨不忍睹 大概来总结一下前两轮: 第一轮是4个小时,3道题,一道网络流,一道环形DP,一道线段树 最后一道题ahoi的原题(传送bzoj1798),非常水的线段树,是个很好 ...

  9. JavaBean的属性变量名前两个字母大小写问题

    Java属性命名规范! 一般情况下.Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等), ...

  10. table固定前两列和最后一列,其他滑动显示

    网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个table的,此示例只固定了前两列和最后一列,和网上的不太一样. 网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个tab ...

随机推荐

  1. LaTeX in 24 Hours - 3. Formatting Texts I

    文章目录 本章内容:文本格式 I 3.1 Sectional Units 3.2 Labeling and Referring Numbered Items 3.3 Texts Alignment 3 ...

  2. OSPF与ISIS比较

  3. unlua

    安装 复制 Plugins 目录到你的UE工程根目录. 重新启动你的UE工程 注意点 新建工程后,必须重新拷贝插件,重新编译.不能从老项目中拷贝,会崩溃~ 加载c++类和蓝图类 -- c++类 loc ...

  4. pytest用例管理框架实战(基础篇)

    先安装pip install pytest pytest用例管理框架 默认规则: 1.py文件必须以test_开头或者_test结尾 2.类名必须以test开头 3.测试用例必须以test_开头 ge ...

  5. MySQL学习(八)BLOB和TEXT区别

    :都市为存储很大数据而设计的字符串数据类型,分别采用二进制和字符方式存储.当blob和text值太大时,innodb会使用专门的"外部"存储区域来进行存储,此时每个值在行内需要1~ ...

  6. 2020 Multi-University Training Contest 1 . Fibonacci Sum 水题改编

    题意很简单,就是让你求这个东西,这个时候你发现,原题???? https://blog.csdn.net/acdreamers/article/details/23039571 哦,只是原来写过的哪一 ...

  7. Redis 缓存雪崩 |击穿 |穿透 概念及解决方案

    一.雪崩 1.概念  指某一时间段,缓存集中过期失效,无数的请求绕开缓存,直接访问数据库. 2.解决方案 让redis数据永不过期,这种方式最可靠的.最安全的,但占用空间,内存消耗大,并且不能保持数据 ...

  8. diyudio 3886 功放机鉴赏

  9. 一个基于GPT模型实现的Git Commit信息自动生成工具

    每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...

  10. 网络----OSI七层

    OSI 订制的是一个用于计算机或通信系统间互联的标准体质(一般称为OSI参考模型或七层模型) OSI 模型把网络通信的工作分为7层分别是: 常用内容:物理层 数据链层 网络层 注解 OSI 7层 1. ...