Welcome to Subscribe On Youtube

3337. Total Characters in String After Transformations II

Description

You are given a string s consisting of lowercase English letters, an integer t representing the number of transformations to perform, and an array nums of size 26. In one transformation, every character in s is replaced according to the following rules:

  • Replace s[i] with the next nums[s[i] - 'a'] consecutive characters in the alphabet. For example, if s[i] = 'a' and nums[0] = 3, the character 'a' transforms into the next 3 consecutive characters ahead of it, which results in "bcd".
  • The transformation wraps around the alphabet if it exceeds 'z'. For example, if s[i] = 'y' and nums[24] = 3, the character 'y' transforms into the next 3 consecutive characters ahead of it, which results in "zab".

Return the length of the resulting string after exactly t transformations.

Since the answer may be very large, return it modulo 109 + 7.

 

Example 1:

Input: s = "abcyy", t = 2, nums = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]

Output: 7

Explanation:

  • First Transformation (t = 1):

    • 'a' becomes 'b' as nums[0] == 1
    • 'b' becomes 'c' as nums[1] == 1
    • 'c' becomes 'd' as nums[2] == 1
    • 'y' becomes 'z' as nums[24] == 1
    • 'y' becomes 'z' as nums[24] == 1
    • String after the first transformation: "bcdzz"
  • Second Transformation (t = 2):

    • 'b' becomes 'c' as nums[1] == 1
    • 'c' becomes 'd' as nums[2] == 1
    • 'd' becomes 'e' as nums[3] == 1
    • 'z' becomes 'ab' as nums[25] == 2
    • 'z' becomes 'ab' as nums[25] == 2
    • String after the second transformation: "cdeabab"
  • Final Length of the string: The string is "cdeabab", which has 7 characters.

Example 2:

Input: s = "azbk", t = 1, nums = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]

Output: 8

Explanation:

  • First Transformation (t = 1):

    • 'a' becomes 'bc' as nums[0] == 2
    • 'z' becomes 'ab' as nums[25] == 2
    • 'b' becomes 'cd' as nums[1] == 2
    • 'k' becomes 'lm' as nums[10] == 2
    • String after the first transformation: "bcabcdlm"
  • Final Length of the string: The string is "bcabcdlm", which has 8 characters.

 

Constraints:

  • 1 <= s.length <= 105
  • s consists only of lowercase English letters.
  • 1 <= t <= 109
  • nums.length == 26
  • 1 <= nums[i] <= 25

Solutions

Solution 1

  • class Solution { private final int mod = (int) 1e9 + 7; public int lengthAfterTransformations(String s, int t, List<Integer> nums) { final int m = 26; int[] cnt = new int[m]; for (char c : s.toCharArray()) { cnt[c - 'a']++; } int[][] matrix = new int[m][m]; for (int i = 0; i < m; i++) { int num = nums.get(i); for (int j = 1; j <= num; j++) { matrix[i][(i + j) % m] = 1; } } int[][] factor = matpow(matrix, t, m); int[] result = vectorMatrixMultiply(cnt, factor); int ans = 0; for (int val : result) { ans = (ans + val) % mod; } return ans; } private int[][] matmul(int[][] a, int[][] b) { int n = a.length; int p = b.length; int q = b[0].length; int[][] res = new int[n][q]; for (int i = 0; i < n; i++) { for (int k = 0; k < p; k++) { if (a[i][k] == 0) continue; for (int j = 0; j < q; j++) { res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod); } } } return res; } private int[][] matpow(int[][] mat, int power, int m) { int[][] res = new int[m][m]; for (int i = 0; i < m; i++) { res[i][i] = 1; } while (power > 0) { if ((power & 1) != 0) { res = matmul(res, mat); } mat = matmul(mat, mat); power >>= 1; } return res; } private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) { int n = matrix.length; int[] result = new int[n]; for (int i = 0; i < n; i++) { long sum = 0; for (int j = 0; j < n; j++) { sum = (sum + 1L * vector[j] * matrix[j][i]) % mod; } result[i] = (int) sum; } return result; } } 
  • class Solution { public: static constexpr int MOD = 1e9 + 7; static constexpr int M = 26; using Matrix = vector<vector<int>>; Matrix matmul(const Matrix& a, const Matrix& b) { int n = a.size(), p = b.size(), q = b[0].size(); Matrix res(n, vector<int>(q, 0)); for (int i = 0; i < n; ++i) { for (int k = 0; k < p; ++k) { if (a[i][k]) { for (int j = 0; j < q; ++j) { res[i][j] = (res[i][j] + 1LL * a[i][k] * b[k][j] % MOD) % MOD; } } } } return res; } Matrix matpow(Matrix mat, int power) { Matrix res(M, vector<int>(M, 0)); for (int i = 0; i < M; ++i) res[i][i] = 1; while (power) { if (power % 2) res = matmul(res, mat); mat = matmul(mat, mat); power /= 2; } return res; } int lengthAfterTransformations(string s, int t, vector<int>& nums) { vector<int> cnt(M, 0); for (char c : s) { cnt[c - 'a']++; } Matrix matrix(M, vector<int>(M, 0)); for (int i = 0; i < M; ++i) { for (int j = 1; j <= nums[i]; ++j) { matrix[i][(i + j) % M] = 1; } } Matrix cntMat(1, vector<int>(M)); for (int i = 0; i < M; ++i) cntMat[0][i] = cnt[i]; Matrix factor = matpow(matrix, t); Matrix result = matmul(cntMat, factor); int ans = 0; for (int x : result[0]) { ans = (ans + x) % MOD; } return ans; } }; 
  • class Solution: def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int: mod = 10**9 + 7 m = 26 cnt = [0] * m for c in s: cnt[ord(c) - ord("a")] += 1 matrix = [[0] * m for _ in range(m)] for i, x in enumerate(nums): for j in range(1, x + 1): matrix[i][(i + j) % m] = 1 def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]: n, p, q = len(a), len(b), len(b[0]) res = [[0] * q for _ in range(n)] for i in range(n): for k in range(p): if a[i][k]: for j in range(q): res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod return res def matpow(mat: List[List[int]], power: int) -> List[List[int]]: res = [[int(i == j) for j in range(m)] for i in range(m)] while power: if power % 2: res = matmul(res, mat) mat = matmul(mat, mat) power //= 2 return res cnt = [cnt] factor = matpow(matrix, t) result = matmul(cnt, factor)[0] ans = sum(result) % mod return ans 
  • func lengthAfterTransformations(s string, t int, nums []int) int { const MOD = 1e9 + 7 const M = 26 cnt := make([]int, M) for _, c := range s { cnt[int(c-'a')]++ } matrix := make([][]int, M) for i := 0; i < M; i++ { matrix[i] = make([]int, M) for j := 1; j <= nums[i]; j++ { matrix[i][(i+j)%M] = 1 } } matmul := func(a, b [][]int) [][]int { n, p, q := len(a), len(b), len(b[0]) res := make([][]int, n) for i := 0; i < n; i++ { res[i] = make([]int, q) for k := 0; k < p; k++ { if a[i][k] != 0 { for j := 0; j < q; j++ { res[i][j] = (res[i][j] + a[i][k]*b[k][j]%MOD) % MOD } } } } return res } matpow := func(mat [][]int, power int) [][]int { res := make([][]int, M) for i := 0; i < M; i++ { res[i] = make([]int, M) res[i][i] = 1 } for power > 0 { if power%2 == 1 { res = matmul(res, mat) } mat = matmul(mat, mat) power /= 2 } return res } cntMat := [][]int{make([]int, M)} copy(cntMat[0], cnt) factor := matpow(matrix, t) result := matmul(cntMat, factor) ans := 0 for _, v := range result[0] { ans = (ans + v) % MOD } return ans } 
  • function lengthAfterTransformations(s: string, t: number, nums: number[]): number { const MOD = BigInt(1e9 + 7); const M = 26; const cnt: number[] = Array(M).fill(0); for (const c of s) { cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]++; } const matrix: number[][] = Array.from({ length: M }, () => Array(M).fill(0)); for (let i = 0; i < M; i++) { for (let j = 1; j <= nums[i]; j++) { matrix[i][(i + j) % M] = 1; } } const matmul = (a: number[][], b: number[][]): number[][] => { const n = a.length, p = b.length, q = b[0].length; const res: number[][] = Array.from({ length: n }, () => Array(q).fill(0)); for (let i = 0; i < n; i++) { for (let k = 0; k < p; k++) { const aik = BigInt(a[i][k]); if (aik !== BigInt(0)) { for (let j = 0; j < q; j++) { const product = aik * BigInt(b[k][j]); const sum = BigInt(res[i][j]) + product; res[i][j] = Number(sum % MOD); } } } } return res; }; const matpow = (mat: number[][], power: number): number[][] => { let res: number[][] = Array.from({ length: M }, (_, i) => Array.from({ length: M }, (_, j) => (i === j ? 1 : 0)), ); while (power > 0) { if (power % 2 === 1) res = matmul(res, mat); mat = matmul(mat, mat); power = Math.floor(power / 2); } return res; }; const cntMat: number[][] = [cnt.slice()]; const factor = matpow(matrix, t); const result = matmul(cntMat, factor); let ans = 0n; for (const v of result[0]) { ans = (ans + BigInt(v)) % MOD; } return Number(ans); } 

All Problems

All Solutions