首页 > 编程语言 >2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数

2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数

时间:2023-08-20 20:45:33浏览次数:50  
标签:arr 20 int 08 ++ cnts ans go ok

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

在这里插入图片描述

标签:arr,20,int,08,++,cnts,ans,go,ok
From: https://www.cnblogs.com/moonfdd/p/17644535.html

相关文章

  • 2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一
    2023-08-20:用go语言写算法。给定一个由'W'、'A'、'S'、'D'四种字符组成的字符串,长度一定是4的倍数,你可以把任意连续的一段子串,变成'W'、'A'、'S'、'D'组成的随意状态,目的是让4种字符词频一样。返回需要修改的最短子串长度。完美走位问题。输入:s="QQQW"。输出:2。解释:我们可以把前......
  • golang 读取运行程序的相关目录
    获取运行程序的所在目录、工作目录import( "fmt" "os" "path/filepath")funcmain(){ fmt.Println("startm1") path,_:=os.Executable() fmt.Println("path",filepath.Dir(path)) dir,_:=filepath.Abs(filepath.Di......
  • 2023-08-20 裸k交易 区间突破30例
    成功突破:案例1:案例2:案例3:案例4:案例5:案例6:案例7:案例8:案例9:案例10:案例11:案例12:案例13:案例14:案例15:案例16:案例17:案例18:案例19:案例20:案例21:案例22:案例23:案例24:案例25:案例26:案例27:案例28:案例29:案例30: 假突破案例1:案例2:案例3:案例4:案例5:案例6:案......
  • 8.20 后记
    T1令\(DP_{i,k}\)表示当前颜料为\(i\),前两个盘子状态为\(k\)的最大收益,\(O(16\timesn)\)的DPT2签到题,但数据结构为空时pop应不出东西,若pop出来东西就不属于三种数据结构T3DP,修改的时候往右找覆盖到哪,扫完到下一层继续往右找,图长这样:T4点分治......
  • 哈希表——解205. 同构字符串及290. 单词规律
    205.同构字符串此题是「290.单词规律」的简化版,需要我们判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,同时t的任意一个字符被s中唯一的字符对应。这也被称为「双射」的关系。以示例2为例,t中的字符a和r虽然有唯一的映射o,但对......
  • QOJ # 6508. This is not an Abnormal Team!
    题面传送门感觉网络流学艺不精,被薄纱了/kk原题意是最少一个点的链,在此基础上最少三个点的链,比较难去用网络流考虑。换个思路:先最大匹配出两点链,然后让最多两点链合并上一个单点变成三点链。这样显然单点最少,并且保证了不会有\(3\)个两点链合并成两个三点链,所以这样是符合题目......
  • 江苏数学夏令营 2023
    初等数论----$1.$(高联2009)证明:对每对正整数$k,l$,有无穷多个$m$,使得$(C^k_m,l)=1.$令$m=alk!+k,\a\in\mathbb{Z_+},$则$C^k_m=(\frac{ak!}{k}l+1)(\frac{ak!}{k-1}l+1)\cdots(\frac{ak!}{1}l+1)$因为$(dl+1,l)=(1,l)=1,\d\in\mathbb{Z},$......
  • Adobe Acrobat DC2023完美内置激活版本
    AdobeAcrobatDC是由AdobeSystems开发的一款PDF文档处理软件,它是Adobe公司的一款核心产品之一,被广泛应用于个人、企业和政府机构等各种领域。AdobeAcrobatDC具有许多功能和特点,包括创建、编辑、注释、转换、共享和保护PDF文档等。此外,它还支持多语言和多平台,包括Windows、MacO......
  • Photoshop 2023完美激活版本
    Photoshop2023内置激活版是一款多合一的创意工具,从社交媒体贴子到修饰相片,设计横幅到精美网站,日常影像编辑到重新创造,轻松塑造艺术灵感,激发创意,自由探索,轻松设计,您可以自由灵活的修饰编辑您的照片,您可以获得一个精美、高质量的图片结果,创建属于您的新的艺术风格,更多智能工具让您......
  • 西农2022级ACM招新考题
    准备放弃一段时间算法。西农2022级ACM招新上周结束了,五一假期研究了一下题解,整理发在博客。1.这真的是签到题print("\"ACMwelcomesyou\\n\"")2.4和数#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e6+10;intf[maxn+1];intl,r;boolche......