Skip to content

Commit ab51502

Browse files
authored
feat: add solutions to lc problem: No.3337 (#4405)
No.3337.Total Characters in String After Transformations II
1 parent 170fd23 commit ab51502

File tree

4 files changed

+333
-4
lines changed

4 files changed

+333
-4
lines changed

solution/3300-3399/3337.Total Characters in String After Transformations II/README.md

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,122 @@ tags:
130130
#### Python3
131131

132132
```python
133-
133+
class Solution:
134+
def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
135+
mod = 10**9 + 7
136+
m = 26
137+
138+
cnt = [0] * m
139+
for c in s:
140+
cnt[ord(c) - ord("a")] += 1
141+
142+
matrix = [[0] * m for _ in range(m)]
143+
for i, x in enumerate(nums):
144+
for j in range(1, x + 1):
145+
matrix[i][(i + j) % m] = 1
146+
147+
def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
148+
n, p, q = len(a), len(b), len(b[0])
149+
res = [[0] * q for _ in range(n)]
150+
for i in range(n):
151+
for k in range(p):
152+
if a[i][k]:
153+
for j in range(q):
154+
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod
155+
return res
156+
157+
def matpow(mat: List[List[int]], power: int) -> List[List[int]]:
158+
res = [[int(i == j) for j in range(m)] for i in range(m)]
159+
while power:
160+
if power % 2:
161+
res = matmul(res, mat)
162+
mat = matmul(mat, mat)
163+
power //= 2
164+
return res
165+
166+
cnt = [cnt]
167+
factor = matpow(matrix, t)
168+
result = matmul(cnt, factor)[0]
169+
170+
ans = sum(result) % mod
171+
return ans
134172
```
135173

136174
#### Java
137175

138176
```java
139-
177+
class Solution {
178+
private final int mod = (int) 1e9 + 7;
179+
180+
public int lengthAfterTransformations(String s, int t, List<Integer> nums) {
181+
final int m = 26;
182+
183+
int[] cnt = new int[m];
184+
for (char c : s.toCharArray()) {
185+
cnt[c - 'a']++;
186+
}
187+
188+
int[][] matrix = new int[m][m];
189+
for (int i = 0; i < m; i++) {
190+
int num = nums.get(i);
191+
for (int j = 1; j <= num; j++) {
192+
matrix[i][(i + j) % m] = 1;
193+
}
194+
}
195+
196+
int[][] factor = matpow(matrix, t, m);
197+
int[] result = vectorMatrixMultiply(cnt, factor);
198+
int ans = 0;
199+
for (int val : result) {
200+
ans = (ans + val) % mod;
201+
}
202+
return ans;
203+
}
204+
205+
private int[][] matmul(int[][] a, int[][] b) {
206+
int n = a.length;
207+
int p = b.length;
208+
int q = b[0].length;
209+
int[][] res = new int[n][q];
210+
for (int i = 0; i < n; i++) {
211+
for (int k = 0; k < p; k++) {
212+
if (a[i][k] == 0) continue;
213+
for (int j = 0; j < q; j++) {
214+
res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod);
215+
}
216+
}
217+
}
218+
return res;
219+
}
220+
221+
private int[][] matpow(int[][] mat, int power, int m) {
222+
int[][] res = new int[m][m];
223+
for (int i = 0; i < m; i++) {
224+
res[i][i] = 1;
225+
}
226+
while (power > 0) {
227+
if ((power & 1) != 0) {
228+
res = matmul(res, mat);
229+
}
230+
mat = matmul(mat, mat);
231+
power >>= 1;
232+
}
233+
return res;
234+
}
235+
236+
private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) {
237+
int n = matrix.length;
238+
int[] result = new int[n];
239+
for (int i = 0; i < n; i++) {
240+
long sum = 0;
241+
for (int j = 0; j < n; j++) {
242+
sum = (sum + 1L * vector[j] * matrix[j][i]) % mod;
243+
}
244+
result[i] = (int) sum;
245+
}
246+
return result;
247+
}
248+
}
140249
```
141250

142251
#### C++

solution/3300-3399/3337.Total Characters in String After Transformations II/README_EN.md

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,122 @@ tags:
127127
#### Python3
128128

129129
```python
130-
130+
class Solution:
131+
def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
132+
mod = 10**9 + 7
133+
m = 26
134+
135+
cnt = [0] * m
136+
for c in s:
137+
cnt[ord(c) - ord("a")] += 1
138+
139+
matrix = [[0] * m for _ in range(m)]
140+
for i, x in enumerate(nums):
141+
for j in range(1, x + 1):
142+
matrix[i][(i + j) % m] = 1
143+
144+
def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
145+
n, p, q = len(a), len(b), len(b[0])
146+
res = [[0] * q for _ in range(n)]
147+
for i in range(n):
148+
for k in range(p):
149+
if a[i][k]:
150+
for j in range(q):
151+
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod
152+
return res
153+
154+
def matpow(mat: List[List[int]], power: int) -> List[List[int]]:
155+
res = [[int(i == j) for j in range(m)] for i in range(m)]
156+
while power:
157+
if power % 2:
158+
res = matmul(res, mat)
159+
mat = matmul(mat, mat)
160+
power //= 2
161+
return res
162+
163+
cnt = [cnt]
164+
factor = matpow(matrix, t)
165+
result = matmul(cnt, factor)[0]
166+
167+
ans = sum(result) % mod
168+
return ans
131169
```
132170

133171
#### Java
134172

135173
```java
136-
174+
class Solution {
175+
private final int mod = (int) 1e9 + 7;
176+
177+
public int lengthAfterTransformations(String s, int t, List<Integer> nums) {
178+
final int m = 26;
179+
180+
int[] cnt = new int[m];
181+
for (char c : s.toCharArray()) {
182+
cnt[c - 'a']++;
183+
}
184+
185+
int[][] matrix = new int[m][m];
186+
for (int i = 0; i < m; i++) {
187+
int num = nums.get(i);
188+
for (int j = 1; j <= num; j++) {
189+
matrix[i][(i + j) % m] = 1;
190+
}
191+
}
192+
193+
int[][] factor = matpow(matrix, t, m);
194+
int[] result = vectorMatrixMultiply(cnt, factor);
195+
int ans = 0;
196+
for (int val : result) {
197+
ans = (ans + val) % mod;
198+
}
199+
return ans;
200+
}
201+
202+
private int[][] matmul(int[][] a, int[][] b) {
203+
int n = a.length;
204+
int p = b.length;
205+
int q = b[0].length;
206+
int[][] res = new int[n][q];
207+
for (int i = 0; i < n; i++) {
208+
for (int k = 0; k < p; k++) {
209+
if (a[i][k] == 0) continue;
210+
for (int j = 0; j < q; j++) {
211+
res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod);
212+
}
213+
}
214+
}
215+
return res;
216+
}
217+
218+
private int[][] matpow(int[][] mat, int power, int m) {
219+
int[][] res = new int[m][m];
220+
for (int i = 0; i < m; i++) {
221+
res[i][i] = 1;
222+
}
223+
while (power > 0) {
224+
if ((power & 1) != 0) {
225+
res = matmul(res, mat);
226+
}
227+
mat = matmul(mat, mat);
228+
power >>= 1;
229+
}
230+
return res;
231+
}
232+
233+
private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) {
234+
int n = matrix.length;
235+
int[] result = new int[n];
236+
for (int i = 0; i < n; i++) {
237+
long sum = 0;
238+
for (int j = 0; j < n; j++) {
239+
sum = (sum + 1L * vector[j] * matrix[j][i]) % mod;
240+
}
241+
result[i] = (int) sum;
242+
}
243+
return result;
244+
}
245+
}
137246
```
138247

139248
#### C++
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Solution {
2+
private final int mod = (int) 1e9 + 7;
3+
4+
public int lengthAfterTransformations(String s, int t, List<Integer> nums) {
5+
final int m = 26;
6+
7+
int[] cnt = new int[m];
8+
for (char c : s.toCharArray()) {
9+
cnt[c - 'a']++;
10+
}
11+
12+
int[][] matrix = new int[m][m];
13+
for (int i = 0; i < m; i++) {
14+
int num = nums.get(i);
15+
for (int j = 1; j <= num; j++) {
16+
matrix[i][(i + j) % m] = 1;
17+
}
18+
}
19+
20+
int[][] factor = matpow(matrix, t, m);
21+
int[] result = vectorMatrixMultiply(cnt, factor);
22+
int ans = 0;
23+
for (int val : result) {
24+
ans = (ans + val) % mod;
25+
}
26+
return ans;
27+
}
28+
29+
private int[][] matmul(int[][] a, int[][] b) {
30+
int n = a.length;
31+
int p = b.length;
32+
int q = b[0].length;
33+
int[][] res = new int[n][q];
34+
for (int i = 0; i < n; i++) {
35+
for (int k = 0; k < p; k++) {
36+
if (a[i][k] == 0) continue;
37+
for (int j = 0; j < q; j++) {
38+
res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod);
39+
}
40+
}
41+
}
42+
return res;
43+
}
44+
45+
private int[][] matpow(int[][] mat, int power, int m) {
46+
int[][] res = new int[m][m];
47+
for (int i = 0; i < m; i++) {
48+
res[i][i] = 1;
49+
}
50+
while (power > 0) {
51+
if ((power & 1) != 0) {
52+
res = matmul(res, mat);
53+
}
54+
mat = matmul(mat, mat);
55+
power >>= 1;
56+
}
57+
return res;
58+
}
59+
60+
private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) {
61+
int n = matrix.length;
62+
int[] result = new int[n];
63+
for (int i = 0; i < n; i++) {
64+
long sum = 0;
65+
for (int j = 0; j < n; j++) {
66+
sum = (sum + 1L * vector[j] * matrix[j][i]) % mod;
67+
}
68+
result[i] = (int) sum;
69+
}
70+
return result;
71+
}
72+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution:
2+
def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
3+
mod = 10**9 + 7
4+
m = 26
5+
6+
cnt = [0] * m
7+
for c in s:
8+
cnt[ord(c) - ord("a")] += 1
9+
10+
matrix = [[0] * m for _ in range(m)]
11+
for i, x in enumerate(nums):
12+
for j in range(1, x + 1):
13+
matrix[i][(i + j) % m] = 1
14+
15+
def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
16+
n, p, q = len(a), len(b), len(b[0])
17+
res = [[0] * q for _ in range(n)]
18+
for i in range(n):
19+
for k in range(p):
20+
if a[i][k]:
21+
for j in range(q):
22+
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod
23+
return res
24+
25+
def matpow(mat: List[List[int]], power: int) -> List[List[int]]:
26+
res = [[int(i == j) for j in range(m)] for i in range(m)]
27+
while power:
28+
if power % 2:
29+
res = matmul(res, mat)
30+
mat = matmul(mat, mat)
31+
power //= 2
32+
return res
33+
34+
cnt = [cnt]
35+
factor = matpow(matrix, t)
36+
result = matmul(cnt, factor)[0]
37+
38+
ans = sum(result) % mod
39+
return ans

0 commit comments

Comments
 (0)