Skip to content

Commit 1376a52

Browse files
committed
Improved tags
1 parent e2b570f commit 1376a52

File tree

4 files changed

+61
-96
lines changed
  • src/main/java/g3301_3400
    • s3324_find_the_sequence_of_strings_appeared_on_the_screen
    • s3325_count_substrings_with_k_frequency_characters_i
    • s3326_minimum_division_operations_to_make_array_non_decreasing
    • s3327_check_if_dfs_strings_are_palindromes

4 files changed

+61
-96
lines changed

src/main/java/g3301_3400/s3324_find_the_sequence_of_strings_appeared_on_the_screen/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3301_3400.s3324_find_the_sequence_of_strings_appeared_on_the_screen;
22

3-
// #Medium #2024_10_21_Time_6_ms_(100.00%)_Space_55.6_MB_(100.00%)
3+
// #Medium #String #Simulation #2024_10_22_Time_6_ms_(92.04%)_Space_55.7_MB_(44.25%)
44

55
import java.util.ArrayList;
66
import java.util.List;
Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,23 @@
11
package g3301_3400.s3325_count_substrings_with_k_frequency_characters_i;
22

3-
// #Medium #2024_10_21_Time_2009_ms_(100.00%)_Space_45.2_MB_(100.00%)
4-
5-
import java.util.HashMap;
6-
import java.util.Map;
7-
import java.util.PriorityQueue;
3+
// #Medium #String #Hash_Table #Sliding_Window #2024_10_22_Time_1_ms_(100.00%)_Space_42_MB_(98.69%)
84

95
public class Solution {
106
public int numberOfSubstrings(String s, int k) {
11-
int charCount = 0;
12-
HashMap<Character, Integer> map = new HashMap<>();
13-
for (int right = 0; right < s.length(); right++) {
14-
char curr = s.charAt(right);
15-
map.put(curr, map.getOrDefault(curr, 0) + 1);
16-
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a);
17-
for (Map.Entry<Character, Integer> ele : map.entrySet()) {
18-
queue.offer(ele.getValue());
19-
}
20-
HashMap<Character, Integer> currMap = new HashMap<>(map);
21-
for (int left = 0; left <= right; left++) {
22-
int maxEle = queue.peek();
23-
if (maxEle < k) {
24-
break;
25-
}
26-
charCount += 1;
27-
char leftChar = s.charAt(left);
28-
int leftCharCount = currMap.get(leftChar);
29-
currMap.put(leftChar, leftCharCount - 1);
30-
queue.remove(leftCharCount);
31-
if (leftCharCount > 1) {
32-
queue.offer(leftCharCount - 1);
33-
}
7+
int left = 0;
8+
int result = 0;
9+
int[] count = new int[26];
10+
for (int i = 0; i < s.length(); i++) {
11+
char ch = s.charAt(i);
12+
count[ch - 'a']++;
13+
14+
while (count[ch - 'a'] == k) {
15+
result += s.length() - i;
16+
char atLeft = s.charAt(left);
17+
count[atLeft - 'a']--;
18+
left++;
3419
}
3520
}
36-
return charCount;
21+
return result;
3722
}
3823
}

src/main/java/g3301_3400/s3326_minimum_division_operations_to_make_array_non_decreasing/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3301_3400.s3326_minimum_division_operations_to_make_array_non_decreasing;
22

3-
// #Medium #2024_10_21_Time_19_ms_(100.00%)_Space_69.1_MB_(100.00%)
3+
// #Medium #Array #Math #Greedy #Number_Theory #2024_10_22_Time_20_ms_(97.34%)_Space_73.1_MB_(5.03%)
44

55
public class Solution {
66
private static final int MAXI = 1000001;

src/main/java/g3301_3400/s3327_check_if_dfs_strings_are_palindromes/Solution.java

Lines changed: 45 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,67 @@
11
package g3301_3400.s3327_check_if_dfs_strings_are_palindromes;
22

3-
// #Hard #2024_10_21_Time_244_ms_(100.00%)_Space_96.3_MB_(100.00%)
3+
// #Hard #Array #String #Hash_Table #Tree #Hash_Function #Depth_First_Search
4+
// #2024_10_22_Time_159_ms_(90.40%)_Space_93.9_MB_(80.80%)
45

56
import java.util.ArrayList;
7+
import java.util.List;
68

79
public class Solution {
8-
private StringBuilder dfsString;
10+
private final List<List<Integer>> e = new ArrayList<>();
11+
private final StringBuilder stringBuilder = new StringBuilder();
12+
private String s;
13+
private int now;
14+
private int n;
15+
private int[] l;
16+
private int[] r;
17+
private int[] p;
18+
private char[] c;
919

10-
private int[] fillManacher(String s) {
11-
int n = s.length();
12-
s = "$" + s + "@";
13-
int[] p = new int[n + 2];
14-
int center = 0;
15-
int right = 0;
16-
for (int i = 1; i <= n; i++) {
17-
int mirror = 2 * center - i;
18-
if (i < right) {
19-
p[i] = Math.min(right - i, p[mirror]);
20-
}
21-
while (s.charAt(i + p[i]) == s.charAt(i - p[i])) {
22-
p[i]++;
23-
}
24-
if (i + p[i] > right) {
25-
center = i;
26-
right = i + p[i];
27-
}
20+
private void dfs(int x) {
21+
l[x] = now + 1;
22+
for (int v : e.get(x)) {
23+
dfs(v);
2824
}
29-
return p;
25+
stringBuilder.append(s.charAt(x));
26+
r[x] = ++now;
3027
}
3128

32-
private int[] manacher() {
33-
StringBuilder temp = new StringBuilder();
34-
for (int i = 0; i < dfsString.length(); i++) {
35-
temp.append("#");
36-
temp.append(dfsString.charAt(i));
29+
private void manacher() {
30+
c[0] = '~';
31+
c[1] = '#';
32+
for (int i = 1; i <= n; ++i) {
33+
c[2 * i + 1] = '#';
34+
c[2 * i] = stringBuilder.charAt(i - 1);
3735
}
38-
temp.append("#");
39-
return fillManacher(String.valueOf(temp));
40-
// return Arrays.copyOfRange(arr, 1, arr.length - 1);
41-
}
42-
43-
private void dfs(
44-
int node, int parent, ArrayList<ArrayList<Integer>> adj, int[][] range, String s) {
45-
int start = dfsString.length();
46-
47-
for (int neigh : adj.get(node)) {
48-
if (neigh == parent) {
49-
continue;
36+
for (int i = 1, mid = 0, r = 0; i <= 2 * n + 1; ++i) {
37+
if (i <= r) p[i] = Math.min(p[(mid << 1) - i], r - i + 1);
38+
while (c[i - p[i]] == c[i + p[i]]) ++p[i];
39+
if (p[i] + i > r) {
40+
r = p[i] + i - 1;
41+
mid = i;
5042
}
51-
dfs(neigh, node, adj, range, s);
5243
}
53-
dfsString.append(s.charAt(node));
54-
int end = dfsString.length() - 1;
55-
range[node] = new int[] {start, end};
5644
}
5745

5846
public boolean[] findAnswer(int[] parent, String s) {
59-
dfsString = new StringBuilder();
60-
int n = parent.length;
61-
ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
62-
for (int i = 0; i < n; i++) {
63-
adj.add(new ArrayList<>());
47+
n = parent.length;
48+
this.s = s;
49+
for (int i = 0; i < n; ++i) {
50+
e.add(new ArrayList<>());
6451
}
65-
for (int i = 0; i < n; i++) {
66-
if (parent[i] == -1) {
67-
continue;
68-
}
69-
adj.get(parent[i]).add(i);
52+
for (int i = 1; i < n; ++i) {
53+
e.get(parent[i]).add(i);
7054
}
71-
int[][] range = new int[n][2];
72-
dfs(0, -1, adj, range, s);
73-
int[] manacherArr = manacher();
55+
l = new int[n];
56+
r = new int[n];
57+
dfs(0);
58+
c = new char[2 * n + 10];
59+
p = new int[2 * n + 10];
60+
manacher();
7461
boolean[] ans = new boolean[n];
75-
for (int i = 0; i < n; i++) {
76-
int[] currRange = range[i];
77-
int length = currRange[1] - currRange[0] + 1;
78-
// +2 because the string has $# in the starting and in the end
79-
int palindromeStart = 2 * currRange[0] + 2;
80-
int palindromeEnd = 2 * currRange[1] + 2;
81-
int center = (palindromeStart + palindromeEnd) / 2;
82-
// represents the palindrome length having center at center.
83-
int palindromeLength = manacherArr[center];
84-
ans[i] = palindromeLength >= length;
62+
for (int i = 0; i < n; ++i) {
63+
int mid = (2 * r[i] - 2 * l[i] + 1) / 2 + 2 * l[i];
64+
ans[i] = p[mid] - 1 >= r[i] - l[i] + 1;
8565
}
8666
return ans;
8767
}

0 commit comments

Comments
 (0)