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'组成的随意状的更多相关文章

  1. 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  2. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  3. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  4. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  5. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  6. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  7. 用C语言写个程序推算出是星期几?(用泰勒公式实现)

    在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...

  8. 自己用C语言写dsPIC / PIC24 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  9. 自己用C语言写单片机PIC18 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  10. 自己用C语言写单片机PIC16 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...

随机推荐

  1. vue请求后端数据和跨域问题

    最近遇到的一个问题 后端写好的接口,前端怎么获取数据 这是我后端的接口:GET 接口 这是我前端运行的项目地址: 简单使用: 咱门前端使用 颇受好评的 axios 来发起请求 这是它的官网:https ...

  2. lec-6-Actor-Critic Algorithms

    从PG→Policy evaluation 更多样本的均值+Causality+Baseline 减少variance 只要拟合估计Q.V:这需要两个网络 Value function fitting ...

  3. GPT大语言模型Vicuna本地化部署实践(效果秒杀Alpaca)

    背景 上一篇文章<GPT大语言模型Alpaca-lora本地化部署实践>介绍了斯坦福大学的Alpaca-lora模型的本地化部署,并验证了实际的推理效果. 总体感觉其实并不是特别理想,原始 ...

  4. springboot 整合jdbc

    在springboot底层无论关系型还是非关系型数据库都是用spring-data进行交互 新建: 通过spring initialer勾选重要依赖jdbc api和mysql driver: 源码分 ...

  5. k8s calico网络

  6. ODOO13之五:Odoo 13开发之导入、导出以及模块数据

    大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...

  7. LeetCode 周赛 352(2023/07/02)一场关于子数组的专题周赛

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 350 场 · 滑动窗口与离 ...

  8. EaselJS 源码分析系列--第一篇

    什么是 EaselJS ? 事儿还得从 Flash 说起,因为我最早接触的就是 Flash, 从 Flash 入行编程的 Flash 最早的脚本是 Actionscript2.0 它的 1.0 我是没 ...

  9. 图片转ASCII字符图案的原理(可调整亮度对比度 宽高度)

    来, 先看效果哈哈哈哈! 演示地址: http://ascii-picture.imlht.com/ "\` """ . "\`"" ...

  10. 【问题解决】docker版本v23.0后,构建Dockerfile中FROM私库镜像报错构建失败

    问题情况 Docker版本在v23.0以后,只要Dockerfile中FROM的私库镜像不存在本地,就会报错: # 我本地是v24.0.2版本Docker [root@localhost ipd]# ...