Skip to content

Commit 946abf8

Browse files
committed
Improved tags
1 parent 05cc3f1 commit 946abf8

File tree

8 files changed

+170
-126
lines changed
  • src/main/java
    • g3201_3300/s3300_minimum_element_after_replacement_with_digit_sum
    • g3301_3400
      • s3301_maximize_the_total_height_of_unique_towers
      • s3302_find_the_lexicographically_smallest_valid_sequence
      • s3303_find_the_occurrence_of_first_almost_equal_substring
      • s3304_find_the_k_th_character_in_string_game_i
      • s3305_count_of_substrings_containing_every_vowel_and_k_consonants_i
      • s3306_count_of_substrings_containing_every_vowel_and_k_consonants_ii
      • s3307_find_the_k_th_character_in_string_game_ii

8 files changed

+170
-126
lines changed

src/main/java/g3201_3300/s3300_minimum_element_after_replacement_with_digit_sum/Solution.java

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
11
package g3201_3300.s3300_minimum_element_after_replacement_with_digit_sum;
22

3-
// #Easy #2024_09_30_Time_4_ms_(100.00%)_Space_43.3_MB_(100.00%)
3+
// #Easy #Array #Math #2024_10_01_Time_1_ms_(100.00%)_Space_42.9_MB_(75.97%)
44

5-
import java.util.Arrays;
6-
7-
public class Solution {
5+
class Solution {
86
public int minElement(int[] nums) {
9-
int n = nums.length;
10-
int[] arr = new int[n];
11-
12-
for (int i = 0; i < n; i++) {
13-
int sum = sumOfDigits(nums[i]);
14-
arr[i] = sum;
7+
int min = Integer.MAX_VALUE;
8+
for (int x : nums) {
9+
min = Math.min(min, solve(x));
1510
}
16-
Arrays.sort(arr);
17-
return arr[0];
11+
return min;
1812
}
1913

20-
private int sumOfDigits(int num) {
14+
private int solve(int x) {
2115
int sum = 0;
22-
if (num <= 9) {
23-
return num;
24-
}
25-
while (num > 0) {
26-
sum += num % 10;
27-
num /= 10;
16+
while (x != 0) {
17+
sum += x % 10;
18+
x /= 10;
2819
}
2920
return sum;
3021
}

src/main/java/g3301_3400/s3301_maximize_the_total_height_of_unique_towers/Solution.java

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

3-
// #Medium #2024_09_30_Time_49_ms_(100.00%)_Space_57.8_MB_(100.00%)
3+
// #Medium #Array #Sorting #Greedy #2024_10_01_Time_49_ms_(92.39%)_Space_57.9_MB_(70.01%)
44

55
import java.util.Arrays;
66

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,49 @@
11
package g3301_3400.s3302_find_the_lexicographically_smallest_valid_sequence;
22

3-
// #Medium #2024_09_30_Time_33_ms_(100.00%)_Space_79.5_MB_(50.00%)
4-
5-
import java.util.Arrays;
3+
// #Medium #String #Dynamic_Programming #Greedy #Two_Pointers
4+
// #2024_10_01_Time_21_ms_(97.32%)_Space_74.3_MB_(74.55%)
65

76
public class Solution {
87
public int[] validSequence(String word1, String word2) {
9-
int n = word1.length();
10-
int m = word2.length();
11-
int[] revGreedyMatchInd = new int[m];
12-
Arrays.fill(revGreedyMatchInd, -1);
13-
int i = n - 1;
14-
int j = m - 1;
15-
while (j >= 0 && i >= 0) {
16-
if (word1.charAt(i) == word2.charAt(j)) {
17-
revGreedyMatchInd[j--] = i;
8+
char[] c1 = word1.toCharArray();
9+
char[] c2 = word2.toCharArray();
10+
int[] dp = new int[c1.length + 1];
11+
int j = c2.length - 1;
12+
for (int i = c1.length - 1; i >= 0; i--) {
13+
if (j >= 0 && c1[i] == c2[j]) {
14+
dp[i] = dp[i + 1] + 1;
15+
j--;
16+
} else {
17+
dp[i] = dp[i + 1];
18+
}
19+
}
20+
int[] ans = new int[c2.length];
21+
int i = 0;
22+
j = 0;
23+
while (i < c1.length && j < c2.length) {
24+
if (c1[i] == c2[j]) {
25+
ans[j] = i;
26+
j++;
27+
} else {
28+
if (dp[i + 1] >= c2.length - 1 - j) {
29+
ans[j] = i;
30+
j++;
31+
i++;
32+
break;
33+
}
1834
}
19-
i--;
35+
i++;
36+
}
37+
if (j < c2.length && i == c1.length) {
38+
return new int[0];
2039
}
21-
boolean canSkip = true;
22-
int j1 = 0;
23-
int i1 = 0;
24-
while (i1 < n && j1 < m && m - j1 <= n - i1) {
25-
if (word1.charAt(i1) == word2.charAt(j1)) {
26-
revGreedyMatchInd[j1++] = i1;
27-
} else if (canSkip && (j1 == m - 1 || i1 < revGreedyMatchInd[j1 + 1])) {
28-
revGreedyMatchInd[j1++] = i1;
29-
canSkip = false;
30-
} else if (!canSkip && revGreedyMatchInd[j1] == -1) {
31-
break;
40+
while (j < c2.length && i < c1.length) {
41+
if (c2[j] == c1[i]) {
42+
ans[j] = i;
43+
j++;
3244
}
33-
i1++;
45+
i++;
3446
}
35-
return j1 == m ? revGreedyMatchInd : new int[0];
47+
return ans;
3648
}
3749
}
Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,60 @@
11
package g3301_3400.s3303_find_the_occurrence_of_first_almost_equal_substring;
22

3-
// #Hard #2024_09_30_Time_1198_ms_(100.00%)_Space_97.4_MB_(100.00%)
4-
5-
import java.util.HashMap;
6-
import java.util.Map;
3+
// #Hard #String #String_Matching #2024_10_01_Time_39_ms_(100.00%)_Space_46.1_MB_(100.00%)
74

85
public class Solution {
9-
public int minStartingIndex(String s, String p) {
10-
Map<Long, Integer> mp = new HashMap<>();
11-
long hash = 0;
12-
long base = 26;
13-
long d = 1;
14-
long hashP = 0;
15-
long mod = 10000000000283L;
6+
public int minStartingIndex(String s, String pattern) {
167
int n = s.length();
17-
int sz = p.length();
18-
// Rolling hash for string s
19-
for (int i = 0; i < n; i++) {
20-
hash = (hash * base + s.charAt(i)) % mod;
21-
if (i >= sz) {
22-
hash = (mod + hash - d * s.charAt(i - sz) % mod) % mod;
23-
} else {
24-
d = d * base % mod;
8+
int left = 0;
9+
int right = 0;
10+
int[] f1 = new int[26];
11+
int[] f2 = new int[26];
12+
for (char ch : pattern.toCharArray()) {
13+
f2[ch - 'a']++;
14+
}
15+
while (right < n) {
16+
char ch = s.charAt(right);
17+
f1[ch - 'a']++;
18+
if (right - left + 1 == pattern.length() + 1) {
19+
f1[s.charAt(left) - 'a']--;
20+
left += 1;
2521
}
26-
if (i >= sz - 1 && !mp.containsKey(hash)) {
27-
mp.put(hash, i - sz + 1);
22+
if (right - left + 1 == pattern.length()) {
23+
if (check(f1, f2, left, right, s, pattern) == true) {
24+
return left;
25+
}
2826
}
27+
right += 1;
2928
}
30-
// Hash for the pattern p
31-
for (int i = 0; i < sz; i++) {
32-
hashP = (hashP * base + p.charAt(i)) % mod;
33-
}
34-
d = 1;
35-
int ans = Integer.MAX_VALUE;
36-
// Find the minimum index with almost equal string
37-
for (int i = sz - 1; i >= 0; i--) {
38-
long newhashP = (mod + hashP - d * p.charAt(i) % mod) % mod;
39-
for (char a = 'a'; a <= 'z'; a++) {
40-
long candidateHash = (newhashP + d * a % mod) % mod;
41-
if (mp.containsKey(candidateHash)) {
42-
ans = Math.min(ans, mp.get(candidateHash));
29+
return -1;
30+
}
31+
32+
private boolean check(int[] f1, int[] f2, int left, int right, String s, String pattern) {
33+
int cnt = 0;
34+
for (int i = 0; i < 26; i++) {
35+
if (f1[i] != f2[i]) {
36+
if ((Math.abs(f1[i] - f2[i]) > 1) || (Math.abs(f1[i] - f2[i]) != 1 && cnt == 2)) {
37+
return false;
4338
}
39+
cnt += 1;
40+
}
41+
}
42+
cnt = 0;
43+
int start = 0;
44+
int end = pattern.length() - 1;
45+
while (start <= end) {
46+
if (s.charAt(start + left) != pattern.charAt(start)) {
47+
cnt += 1;
48+
}
49+
if (start + left != left + end && s.charAt(left + end) != pattern.charAt(end)) {
50+
cnt += 1;
51+
}
52+
if (cnt >= 2) {
53+
return false;
4454
}
45-
d = d * base % mod;
55+
start++;
56+
end--;
4657
}
47-
return ans == Integer.MAX_VALUE ? -1 : ans;
58+
return true;
4859
}
4960
}
Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
package g3301_3400.s3304_find_the_k_th_character_in_string_game_i;
22

3-
// #Easy #2024_09_30_Time_16_ms_(100.00%)_Space_44.5_MB_(100.00%)
3+
// #Easy #Math #Bit_Manipulation #Simulation #Recursion
4+
// #2024_10_01_Time_0_ms_(100.00%)_Space_41.2_MB_(99.17%)
45

56
public class Solution {
67
public char kthCharacter(int k) {
7-
StringBuilder sb = new StringBuilder();
8-
char c = 'a';
9-
sb.append(c);
10-
String s = sb.toString();
11-
while (s.length() <= k) {
12-
s = sb.toString();
13-
char[] cq = s.toCharArray();
14-
for (char c1 : cq) {
15-
int ascii = c1;
16-
c1 = (char) (ascii + 1);
17-
sb.append(c1);
18-
}
8+
// Initialize the length of the current string
9+
// Initial length when word = "a"
10+
int length = 1;
11+
12+
// Find the total length after enough iterations
13+
while (length < k) {
14+
length *= 2;
1915
}
20-
for (int i = 0; i < sb.toString().length(); i++) {
21-
if (i == k) {
22-
return sb.toString().charAt(i - 1);
16+
// Trace back to the original character
17+
// Start with 'a'
18+
char currentChar = 'a';
19+
while (length > 1) {
20+
length /= 2;
21+
if (k > length) {
22+
// Adjust k for the next character
23+
k -= length;
24+
// Move to the next character
25+
currentChar++;
26+
if (currentChar > 'z') {
27+
// Wrap around if exceeds 'z'
28+
currentChar = 'a';
29+
}
2330
}
2431
}
25-
return '\0';
32+
return currentChar;
2633
}
2734
}
Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,60 @@
11
package g3301_3400.s3305_count_of_substrings_containing_every_vowel_and_k_consonants_i;
22

3-
// #Medium #2024_09_30_Time_1998_ms_(100.00%)_Space_45.5_MB_(50.00%)
4-
5-
import java.util.HashSet;
3+
// #Medium #String #Hash_Table #Sliding_Window #2024_10_01_Time_2_ms_(99.72%)_Space_42.2_MB_(98.48%)
64

75
public class Solution {
86
public int countOfSubstrings(String word, int k) {
9-
int possibleSubstring = 0;
10-
HashSet<Character> vowelContainer = new HashSet<>();
11-
String vowel = "aeiou";
12-
for (char ch : vowel.toCharArray()) {
13-
vowelContainer.add(ch);
14-
}
15-
for (int i = 0; i < word.length(); i++) {
16-
for (int j = i; j < word.length(); j++) {
17-
if (checkValid(word, i, j, vowelContainer, k)) {
18-
possibleSubstring++;
7+
char[] arr = word.toCharArray();
8+
int[] map = new int[26];
9+
map['a' - 'a']++;
10+
map['e' - 'a']++;
11+
map['i' - 'a']++;
12+
map['o' - 'a']++;
13+
map['u' - 'a']++;
14+
int need = 5;
15+
int ans = 0;
16+
int consCnt = 0;
17+
int j = 0;
18+
for (int i = 0; i < arr.length; i++) {
19+
while (j < arr.length && (need > 0 || consCnt < k)) {
20+
if (isVowel(arr[j])) {
21+
map[arr[j] - 'a']--;
22+
if (map[arr[j] - 'a'] == 0) {
23+
need--;
24+
}
25+
} else {
26+
consCnt++;
1927
}
28+
j++;
29+
}
30+
if (need == 0 && consCnt == k) {
31+
ans++;
32+
int m = j;
33+
while (m < arr.length) {
34+
if (isVowel(arr[m])) {
35+
ans++;
36+
} else {
37+
break;
38+
}
39+
m++;
40+
}
41+
}
42+
if (isVowel(arr[i])) {
43+
map[arr[i] - 'a']++;
44+
if (map[arr[i] - 'a'] == 1) {
45+
need++;
46+
}
47+
} else {
48+
consCnt--;
2049
}
2150
}
22-
return possibleSubstring;
51+
return ans;
2352
}
2453

25-
private boolean checkValid(
26-
String word, int start, int end, HashSet<Character> vowelContainer, int limit) {
27-
HashSet<Character> duplicateCheck = new HashSet<>();
28-
int consonants = 0;
29-
for (int i = start; i <= end; i++) {
30-
if (!vowelContainer.contains(word.charAt(i))) {
31-
consonants++;
32-
} else {
33-
duplicateCheck.add(word.charAt(i));
34-
}
54+
private boolean isVowel(char ch) {
55+
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
56+
return true;
3557
}
36-
return duplicateCheck.size() == 5 && consonants == limit;
58+
return false;
3759
}
3860
}

src/main/java/g3301_3400/s3306_count_of_substrings_containing_every_vowel_and_k_consonants_ii/Solution.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package g3301_3400.s3306_count_of_substrings_containing_every_vowel_and_k_consonants_ii;
22

3-
// #Medium #2024_09_30_Time_341_ms_(100.00%)_Space_46.1_MB_(100.00%)
3+
// #Medium #String #Hash_Table #Sliding_Window
4+
// #2024_10_01_Time_340_ms_(44.09%)_Space_46.3_MB_(62.47%)
45

56
import java.util.HashMap;
67
import java.util.HashSet;

src/main/java/g3301_3400/s3307_find_the_k_th_character_in_string_game_ii/Solution.java

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

3-
// #Hard #2024_09_30_Time_1_ms_(100.00%)_Space_43.4_MB_(100.00%)
3+
// #Hard #Math #Bit_Manipulation #Recursion #2024_10_01_Time_1_ms_(99.65%)_Space_43.2_MB_(59.72%)
44

55
public class Solution {
66
public char kthCharacter(long k, int[] operations) {

0 commit comments

Comments
 (0)