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 ...
随机推荐
- 2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回。已知二叉树中没有重复值。
2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回.已知二叉树中没有重复值. 福大大 答案2021-08-01: 先序遍 ...
- flutter 填坑之旅(dart学习笔记篇)
俗话说 '工欲善其事必先利其器' 想要撸flutter app 而不懂 dart 那就像一个不会英语的人在和英国人交流,懵! 安装 dart 就不用说了,比较简单dart 官网 https://dar ...
- WPF 入门笔记 - 03 - 样式基础及控件模板
原学习路线是按照圣殿骑士的<WPF基础到企业应用系列>的路线走的,但是布局之后直接依赖属性学起来有些僵硬,不太好理解,尝试了文章的前部分内容后放弃,调整为本篇博文内容.笔记路线将按照痕迹g ...
- 我们浏览 GitHub 时,经常看到 "WIP" 的分支,即 Work In Progress,正在开发过程中(尚不能独立的运行)的代码。这部分的代码在 Github/Gitlab 中将禁用“合......
本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...
- 使用C语言实现简单的通用的链表
在数据结构中,我们已经学习到了简单的静态链表以及单链表和双链表,它们各有优缺点,但是有个共同的问题是他们呢无法存储不同的数据.下面提供了一种方法,可以将不同节点的数据链接起来. 下面的代码都是基础的C ...
- java匿名内部类的初解
java原生态中的匿名内部类 1.匿名内部类的定义 使用匿名内部类的两种的方法 建立父类,重写父类的方法 实现接口的方法 2.普通类的实现 1. 普通类实现 实现普通类需要先声明对一个类的对象,再调用 ...
- 手把手教你实战TDD
1. 前言 领域驱动设计,测试驱动开发. 我们在<手把手教你落地DDD>一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解.T ...
- Java 网络编程 —— 安全网络通信
SSL 简介 SSL(Secure Socket Layer,安全套接字层)是一种保证网络上的两个节点进行安全通信的协议.IETF(Interet Engineering Task Force)国际组 ...
- Serverless试飞员的夙愿 | 带您扶摇直上,酣畅淋漓的云上作战
上期博文带您体验了外挂云函数Demo包,感受通过云函数使用云数据库快速突破"音障",进入"长机"云函数+"僚机"云数据库的Serverle ...
- 如何使用libavfilter库给输入文件input.yuv添加视频滤镜?
一.视频滤镜初始化 本次代码实现的是给输入视频文件添加水平翻转滤镜,在视频滤镜初始化部分我们可以分为以下几步进行: 1.创建滤镜图结构 视频滤镜功能最核心的结构为滤镜图结构,即AVFilterGrap ...