2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数, 你可以把任意连续的一段子串,变成'W'、'A'、'S'、'D'组成的随意状
2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数,
你可以把任意连续的一段子串,变成'W'、'A'、'S'、'D'组成的随意状态,
目的是让4种字符词频一样。
返回需要修改的最短子串长度。
完美走位问题。
输入:s = "QQQW"。
输出:2。
解释:我们可以把前面的 "QQ" 替换成 "ER"。
来自华为OD。
来自左程云。
答案2023-08-20:
算法步骤:
1.定义辅助函数ok(),用于判断当前字符词频是否能使四种字符的词频相同。
2.初始化数组arr保存每个字符的对应值('Q': 0, 'W': 1, 'E': 2, 'R': 3)和数组cnts记录每个字符的词频。
3.使用双指针来搜索每个可能的子串。外层循环控制左指针,内层循环控制右指针。
4.当当前子串不满足要求时,右指针向右移动并更新词频数组cnts,直到子串满足要求。
5.当子串满足要求时,更新当前最短子串长度。
6.左指针向右移动并更新词频数组,继续搜索可能的子串。
7.返回最短子串长度。
总的时间复杂度为O(n),其中n是字符串的长度。
总的额外空间复杂度为O(1),因为只使用了固定大小的数组和常数个变量。
go完整代码如下:
package main
import "fmt"
func balancedString(s string) int {
n := len(s)
arr := make([]int, n)
cnts := make([]int, 4)
for i := 0; i < n; i++ {
switch s[i] {
case 'Q':
arr[i] = 0
case 'W':
arr[i] = 1
case 'E':
arr[i] = 2
case 'R':
arr[i] = 3
}
cnts[arr[i]]++
}
ans := n
for l, r := 0, 0; l < n; l++ {
for !ok(cnts, l, r) && r < n {
cnts[arr[r]]--
r++
}
if ok(cnts, l, r) {
ans = min(ans, r-l)
} else {
break
}
cnts[arr[l]]++
}
return ans
}
func ok(cnts []int, l int, r int) bool {
maxCnt := max(max(max(cnts[0], cnts[1]), cnts[2]), cnts[3])
changes := maxCnt*4 - cnts[0] - cnts[1] - cnts[2] - cnts[3]
rest := r - l - changes
return rest >= 0 && rest%4 == 0
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
s := "QQQW"
result := balancedString(s)
fmt.Println(result)
}

rust完整代码如下:
fn balanced_string(s: &str) -> i32 {
let n = s.len() as i32;
let mut arr = Vec::with_capacity(n as usize);
let mut cnts = vec![0; 4];
for c in s.chars() {
let val = match c {
'W' => 1,
'E' => 2,
'R' => 3,
_ => 0,
};
arr.push(val);
cnts[val] += 1;
}
let mut ans = n;
for l in 0..n {
let mut r = l;
while !ok(&cnts, l, r) && r < n {
cnts[arr[r as usize] as usize] -= 1;
r += 1;
}
if ok(&cnts, l, r) {
ans = ans.min(r - l);
} else {
break;
}
cnts[arr[l as usize] as usize] += 1;
}
ans
}
fn ok(cnts: &[i32], l: i32, r: i32) -> bool {
let max_cnt = cnts.iter().max().copied().unwrap_or(0);
let changes = max_cnt * 4 - cnts[0] - cnts[1] - cnts[2] - cnts[3];
let rest = r - l - changes;
rest >= 0 && rest % 4 == 0
}
fn main() {
let s = "QQQW";
let result = balanced_string(s);
println!("{}", result);
}

c++完整代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
bool ok(const std::vector<int>& cnts, int l, int r);
int balancedString(const std::string& str) {
int n = str.size();
std::vector<int> arr(n);
std::vector<int> cnts(4);
for (int i = 0; i < n; i++) {
char c = str[i];
arr[i] = (c == 'W' ? 1 : (c == 'E' ? 2 : (c == 'R' ? 3 : 0)));
cnts[arr[i]]++;
}
int ans = n;
for (int l = 0, r = 0; l < n; l++) {
while (!ok(cnts, l, r) && r < n) {
cnts[arr[r++]]--;
}
if (ok(cnts, l, r)) {
ans = std::min(ans, r - l);
}
else {
break;
}
cnts[arr[l]]++;
}
return ans;
}
bool ok(const std::vector<int>& cnts, int l, int r) {
int maxCnt = std::max(std::max(cnts[0], cnts[1]), std::max(cnts[2], cnts[3]));
int changes = maxCnt * 4 - cnts[0] - cnts[1] - cnts[2] - cnts[3];
int rest = r - l - changes;
return rest >= 0 && rest % 4 == 0;
}
int main() {
std::string s = "QQQW";
int result = balancedString(s);
std::cout << "Result: " << result << std::endl;
return 0;
}

c完整代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int balancedString(char* s) {
int n = strlen(s);
int* arr = (int*)malloc(sizeof(int) * n);
int cnts[4] = { 0 };
for (int i = 0; i < n; i++) {
char c = s[i];
arr[i] = c == 'W' ? 1 : (c == 'E' ? 2 : (c == 'R' ? 3 : 0));
cnts[arr[i]]++;
}
int ans = n;
for (int l = 0, r = 0; l < n; l++) {
while (!ok(cnts, l, r) && r < n) {
cnts[arr[r++]]--;
}
if (ok(cnts, l, r)) {
ans = ans < r - l ? ans : r - l;
}
else {
break;
}
cnts[arr[l]]++;
}
free(arr);
return ans;
}
int ok(int* cnts, int l, int r) {
int maxCnt = cnts[0];
for (int i = 1; i < 4; i++) {
if (cnts[i] > maxCnt) {
maxCnt = cnts[i];
}
}
int changes = maxCnt * 4 - cnts[0] - cnts[1] - cnts[2] - cnts[3];
int rest = r - l - changes;
return rest >= 0 && rest % 4 == 0;
}
int main() {
char s[] = "QQQW";
int result = balancedString(s);
printf("%d\n", result);
return 0;
}

2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数, 你可以把任意连续的一段子串,变成'W'、'A'、'S'、'D'组成的随意状的更多相关文章
- 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...
- LeetCode算法题-Valid Perfect Square(Java实现-四种解法)
这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...
- LeetCode算法题-Third Maximum Number(Java实现-四种解法)
这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- 用C语言写个程序推算出是星期几?(用泰勒公式实现)
在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...
- 自己用C语言写dsPIC / PIC24 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC18 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC16 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...
随机推荐
- vue全家桶进阶之路25:Vue2的停维通知
Vue 2 的技术支持会持续多久?从官方发文来看,Vue 2.7 是当前.同时也是最后一个 Vue 2.x 的次级版本更新.Vue 2.7 会以其发布日期,即 2022 年 7 月 1 日开始计算,提 ...
- MVC 三层架构案例详细讲解
MVC 三层架构案例详细讲解 @ 目录 MVC 三层架构案例详细讲解 每博一文案 1. MVC 概述 2. MVC设计思想 3. 三层架构 4. MVC 与 三层架构的关系: 5. 案例举例:用户账户 ...
- XTU OJ 程设训练 1407 Alice and Bob
题目描述 Alice和Bob打球,已知他们打过的每一回合的输赢情况,每个回合获胜的一方可以得一分. Alice可以随意设定赢得一局比赛所需的分数和赢得整个比赛所需要的局数. Alice想赢得比赛,请问 ...
- 代码随想录算法训练营Day24 回溯算法|216.组合总和III 17.电话号码的字母组合
代码随想录算法训练营 216.组合总和III 题目链接:216.组合总和III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说 ...
- 电赛控制类PID算法实现
一.什么是PID 学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例.积分和微分运算变换后形成的一种控制规律.PID 算法的一般形式: PID控制系统原理框图 二.PID离散化 ...
- 如何科学地利用MTTR优化软件交付流程?
谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振.在本文中,你将了解到 MTTR 的作用.为什么它对行业研究很有用.你可能被它误导的原因以及如何避免 MTTR ...
- 6.4. HttpClient
1. 什么是HttpClient? HttpClient是Java 11中引入的一个新特性,用于支持同步和异步发送HTTP请求以及处理HTTP响应.它提供了简单易用的API,使得发送HTTP请求变得非 ...
- 驱动开发:内核实现SSDT挂钩与摘钩
在前面的文章<驱动开发:内核解析PE结构导出表>中我们封装了两个函数KernelMapFile()函数可用来读取内核文件,GetAddressFromFunction()函数可用来在导出表 ...
- .netcore中的虚拟文件EmbeddedFile
以前一直比较好奇像swagger,cap,skywalking等组件是如何实现引用一个dll即可在网页上展示界面的,难道这么多html,js,css等都是硬编码写死在代码文件中的?后面接触apb里面也 ...
- 天下苦 Spring 久矣,Solon v2.3.3 发布
Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...