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. npm install报错node-sass@7.0.1 postinstall: `node scripts/build.js`

    在控制台执行 即可 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass

  2. 2014年蓝桥杯C/C++大学B组省赛真题(李白打酒)

    题目描述: 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店 ...

  3. Linux,会这些就够了

    在测试当中,其实对Linux的要求不高,我们在工作中需要记住常用的一些命令,不常用的实际用到的时候再查在记即可,最重要我们要使用命令可以查看日志,定位bug   目录篇: 可用  pwd  命令查看用 ...

  4. 2023-05-26:golang关于垃圾回收和析构函数的选择题,多数人会选错。

    2023-05-26:golang关于垃圾回收和析构的选择题,代码如下: package main import ( "fmt" "runtime" " ...

  5. 代码随想录算法训练营Day18 二叉树|  654.最大二叉树  617.合并二叉树  700.二叉搜索树中的搜索  98.验证二叉搜索树

    654.最大二叉树 题目链接:654.最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地 ...

  6. filler 抓取手机app的数据,手机wifi设置

    1.处于同一局域网下, 2.手机的代服务器修改为手动 3.代理服务器,名称为本机ip地址端口为8888,可以自己设置 4.fillder上面选择允许远程链接

  7. 最小编译器和 UI 框架「GitHub 热点速览」

    如果有一个关键词来概述本周的 GitHub 热门项目的话,大概就是 van 和 sectorc 都用到的 smallest.只不过一个是前端的响应式框架,一个是搞编译的 C 编译器.它们除了轻量化这个 ...

  8. 10.1. Java性能调优

    Java性能调优是一个复杂且重要的主题,它涉及到了JVM.垃圾收集器.内存管理.多线程.代码优化等多个方面.在本节中,我们将对Java性能调优的基本概念和方法进行简要介绍. 10.1.1. 理解性能指 ...

  9. 尚医通-day12【token续期和就诊人管理】(内附源码)

    页面预览 就诊人管理 就诊人列表 添加就诊人 查看就诊人 ![image-20230225060710 管理员系统用户管理 前面我们完成了用户登录.用户认证与就诊人管理,现在我们需要把这些信息在我们的 ...

  10. C++ 核心指南之资源管理(上)

    C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正 ...