3335. 字符串转换后的长度 I

题目链接

3335. 字符串转换后的长度 I - 力扣(LeetCode)

题目描述

给你一个字符串 s 和一个整数 t,表示要执行的 转换 次数。每次 转换 需要根据以下规则替换字符串 s 中的每个字符:

  • 如果字符是 'z',则将其替换为字符串 "ab"
  • 否则将其替换为字母表中的下一个字符。例如,'a' 替换为 'b''b' 替换为 'c'

返回 恰好 执行 t 次转换后得到的字符串的 长度。

由于答案可能非常大,返回其对 109 + 7 取余的结果。

题目示例

示例 1 :

java 复制代码
输入: 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 个字符。

示例 2 :

java 复制代码
输入: s = "azbk", t = 1

输出: 5

解释:

第一次转换 (t = 1)
'a' 变为 'b'
'z' 变为 "ab"
'b' 变为 'c'
'k' 变为 'l'
第一次转换后的字符串为:"babcl"
最终字符串长度:字符串为 "babcl",长度为 5 个字符。

解题思路

  1. 问题理解
    • 给定一个字符串s和变换次数t,每次变换的规则是:
      • 每个字母向后移动一位(abbc,...,yz)。
      • 字母z变为a,并且每次z变为a时会额外生成一个b
    • 需要计算经过t次变换后字符串的长度。
  2. 关键思路
    • 统计字母频率:首先统计字符串中每个字母的出现次数。
    • 模拟变换过程
      • 每次变换时,记录字母z的数量z
      • 将所有字母向后移动一位(abbc,...,yz)。
      • z变为a(即cnt[0] = z)。
      • 由于每个z变为a时会生成一个b,因此b的数量增加z
      • 每次变换后,字符串长度增加z(因为每个z变为a后长度不变,但会生成一个b)。
  3. 算法流程
    • 初始化字母频率数组cnt
    • 进行t次变换,每次变换后更新字母频率和字符串长度。
    • 返回最终长度ans

题解代码

java 复制代码
class Solution {
    private final int MOD = 1000000007; // 定义模数,防止数值溢出

    public int lengthAfterTransformations(String s, int t) {
        // 统计字符串中每个字母的出现次数
        int[] cnt = new int[26];
        for (int i = 0; i < s.length(); i++) {
            cnt[s.charAt(i) - 'a']++;
        }

        int ans = s.length(); // 初始长度为字符串长度

        // 进行t次变换
        while (t-- > 0) {
            int z = cnt[25]; // 记录字母'z'的数量

            // 将字母向后移动一位(a->b, b->c, ..., y->z)
            for (int i = 24; i >= 0; i--) {
                cnt[i + 1] = cnt[i];
            }

            cnt[0] = z; // 字母'z'变为'a'
            cnt[1] = (cnt[1] + z) % MOD; // 字母'b'的数量增加z(因为每个'z'变为'a'后会生成一个'b')
            ans = (ans + z) % MOD; // 每次变换后,字符串长度增加z(因为每个'z'变为'a'后长度不变,但会生成一个'b')
        }

        return ans;
    }
}

复杂度分析

  1. 时间复杂度
    • 统计字母频率:O(n),其中n是字符串长度。
    • 每次变换:
      • 移动字母频率:O(26) = O(1)。
      • 更新b的数量和字符串长度:O(1)。
    • 总时间复杂度:O(n + t * 26) ≈ O(n + t)。
  2. 空间复杂度
    • 字母频率数组cnt:O(26) = O(1)。
    • 其他变量:O(1)。
    • 总空间复杂度:O(1)。
相关推荐
Dxy12393102164 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
westdata-Tm4 小时前
洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
算法·深度优先·dfs
南宫萧幕4 小时前
MATLAB/Simulink 从零打通:HEV 能量管理 GA 联合仿真保姆级建模指南
开发语言·算法·matlab·汽车·控制·pid
小雅痞4 小时前
[Java][Leetcode middle] 15. 三数之和
java·算法·leetcode
图码4 小时前
矩阵数据结构入门指南:声明、初始化与基本操作
运维·数据结构·线性代数·算法·矩阵
Navigator_Z4 小时前
LeetCode //C - 1030. Matrix Cells in Distance Order
c语言·算法·leetcode
无敌昊哥战神4 小时前
【回溯算法巅峰之作】LeetCode 51. N皇后问题详解与常见避坑指南 (C/C++/Python)
c语言·算法·leetcode
mftang4 小时前
BSS段、Data段、Text段的具体含义和数据特性
数据库·算法
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【反悔贪心】:建筑抢修
c++·算法·贪心·反悔贪心·csp·信奥赛·建筑抢修