2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,

举报
福大大架构师每日一题 发表于 2025/05/24 19:36:38 2025/05/24
【摘要】 2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,对字符串中每个字符进行如下替换规则:若字符是 ‘z’,则用字符串 “ab” 替换它;否则,将该字符替换为字母表中下一个字符(例如 ‘a’ 变成 ‘b’,‘b’ 变成 ‘c’,依次类推)。要求计算执行完第 t 次转换后,最终字符串的长度。由于结果可能非常大,需要返回结...

2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,对字符串中每个字符进行如下替换规则:

  • 若字符是 ‘z’,则用字符串 “ab” 替换它;

  • 否则,将该字符替换为字母表中下一个字符(例如 ‘a’ 变成 ‘b’,‘b’ 变成 ‘c’,依次类推)。
    要求计算执行完第 t 次转换后,最终字符串的长度。由于结果可能非常大,需要返回结果对 1000000007 取模的值。

1 <= s.length <= 100000。

s 仅由小写英文字母组成。

1 <= t <= 100000。

输入: s = “abcyy”, t = 2。

输出: 7。

解释:

第一次转换 (t = 1)

‘a’ 变为 ‘b’

‘b’ 变为 ‘c’

‘c’ 变为 ‘d’

‘y’ 变为 ‘z’

‘y’ 变为 ‘z’

第一次转换后的字符串为:“bcdzz”

第二次转换 (t = 2)

‘b’ 变为 ‘c’

‘c’ 变为 ‘d’

‘d’ 变为 ‘e’

‘z’ 变为 “ab”

‘z’ 变为 “ab”

第二次转换后的字符串为:“cdeabab”

最终字符串长度:字符串为 “cdeabab”,长度为 7 个字符。

题目来自力扣3335。

算法流程:

  1. 初始化 cnt[26],统计 s 中每个字符的出现次数。
  2. 预计算 pow2[t + 1],其中 pow2[i] = 2^i % mod
  3. 初始化 ans = 0
  4. 对于每个字符 c(从 'a''z'):
    • 如果 c == 'z'
      • ans += cnt[25] * pow2[t] % mod
    • 否则:
      • 计算 k = (25 - (c - 'a') + 26) % 26
      • 如果 k <= t
        • ans += cnt[c - 'a'] * pow2[t - k] % mod
      • 否则:
        • ans += cnt[c - 'a'] % mod
  5. 返回 ans % mod

时间复杂度和空间复杂度:

  • 时间复杂度:
    • 统计字符频率:O(n),其中 ns 的长度。
    • 预计算 pow2O(t)
    • 计算每个字符的贡献:O(26)(因为只有 26 个字母)。
    • 总时间复杂度:O(n + t)
  • 空间复杂度:
    • cnt[26]O(1)
    • pow2[t + 1]O(t)
    • 总空间复杂度:O(t)

Rust完整代码如下:

const MOD: usize = 1_000_000_007;

fn length_after_transformations(s: &str, t: usize) -> usize {
    let mut cnt = vec![0usize; 26];
    for ch in s.chars() {
        cnt[(ch as u8 - b'a') as usize] += 1;
    }
    for _ in 0..t {
        let mut nxt = vec![0usize; 26];
        // 'z' -> "ab"
        nxt[0] = cnt[25] % MOD;
        nxt[1] = (cnt[25] + cnt[0]) % MOD;
        for i in 2..26 {
            nxt[i] = cnt[i-1] % MOD;
        }
        cnt = nxt;
    }
    cnt.iter().fold(0, |acc, &x| (acc + x) % MOD)
}

fn main() {
    let s = "abcyy";
    let t = 2;
    let result = length_after_transformations(s, t);
    println!("{}", result);
}

在这里插入图片描述

Go完整代码如下:

package main

import (
	"fmt"
)

const mod = 1000000007

func lengthAfterTransformations(s string, t int) int {
	cnt := make([]int, 26)
	for _, ch := range s {
		cnt[ch-'a']++
	}
	for round := 0; round < t; round++ {
		nxt := make([]int, 26)
		nxt[0] = cnt[25]
		nxt[1] = (cnt[25] + cnt[0]) % mod
		for i := 2; i < 26; i++ {
			nxt[i] = cnt[i-1]
		}
		cnt = nxt
	}
	ans := 0
	for i := 0; i < 26; i++ {
		ans = (ans + cnt[i]) % mod
	}
	return ans
}

func main() {
	s := "abcyy"
	t := 2
	result := lengthAfterTransformations(s, t)
	fmt.Println(result)
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。