diff --git a/README.md b/README.md
index 25cfc2a..7a7fb31 100644
--- a/README.md
+++ b/README.md
@@ -393,6 +393,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| | | | | |
|-|-|-|-|-|-
+| 0242 |[Valid Anagram](src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts)| Easy | String, Hash_Table, Sorting | 4 | 97.99
#### Day 12 Class and Object
@@ -884,6 +885,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| 0020 |[Valid Parentheses](src/main/ts/g0001_0100/s0020_valid_parentheses/solution.ts)| Easy | Top_100_Liked_Questions, Top_Interview_Questions, String, Stack, Big_O_Time_O(n)_Space_O(n) | 1 | 86.85
| 0005 |[Longest Palindromic Substring](src/main/ts/g0001_0100/s0005_longest_palindromic_substring/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, String, Dynamic_Programming, Big_O_Time_O(n)_Space_O(n) | 8 | 99.14
| 0394 |[Decode String](src/main/ts/g0301_0400/s0394_decode_string/solution.ts)| Medium | Top_100_Liked_Questions, String, Stack, Recursion, Big_O_Time_O(n)_Space_O(n) | 0 | 100.00
+| 0242 |[Valid Anagram](src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts)| Easy | String, Hash_Table, Sorting | 4 | 97.99
| 0049 |[Group Anagrams](src/main/ts/g0001_0100/s0049_group_anagrams/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, String, Hash_Table, Sorting, Big_O_Time_O(n\*k_log_k)_Space_O(n) | 27 | 78.99
| 0151 |[Reverse Words in a String](src/main/ts/g0101_0200/s0151_reverse_words_in_a_string/solution.ts)| Medium | String, Two_Pointers | 0 | 100.00
@@ -1081,12 +1083,15 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| 0054 |[Spiral Matrix](src/main/ts/g0001_0100/s0054_spiral_matrix/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Matrix, Simulation | 0 | 100.00
| 0048 |[Rotate Image](src/main/ts/g0001_0100/s0048_rotate_image/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Math, Matrix, Big_O_Time_O(n^2)_Space_O(1) | 0 | 100.00
| 0073 |[Set Matrix Zeroes](src/main/ts/g0001_0100/s0073_set_matrix_zeroes/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Hash_Table, Matrix, Big_O_Time_O(m\*n)_Space_O(1) | 4 | 50.63
+| 0289 |[Game of Life](src/main/ts/g0201_0300/s0289_game_of_life/solution.ts)| Medium | Array, Matrix, Simulation | 0 | 100.00
#### Top Interview 150 Hashmap
| | | | | |
|-|-|-|-|-|-
| 0205 |[Isomorphic Strings](src/main/ts/g0201_0300/s0205_isomorphic_strings/solution.ts)| Easy | String, Hash_Table | 3 | 96.02
+| 0290 |[Word Pattern](src/main/ts/g0201_0300/s0290_word_pattern/solution.ts)| Easy | String, Hash_Table | 0 | 100.00
+| 0242 |[Valid Anagram](src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts)| Easy | String, Hash_Table, Sorting | 4 | 97.99
| 0049 |[Group Anagrams](src/main/ts/g0001_0100/s0049_group_anagrams/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, String, Hash_Table, Sorting, Big_O_Time_O(n\*k_log_k)_Space_O(n) | 27 | 78.99
| 0001 |[Two Sum](src/main/ts/g0001_0100/s0001_two_sum/solution.ts)| Easy | Top_100_Liked_Questions, Top_Interview_Questions, Array, Hash_Table, Big_O_Time_O(n)_Space_O(n), AI_can_be_used_to_solve_the_task | 1 | 89.70
| 0202 |[Happy Number](src/main/ts/g0201_0300/s0202_happy_number/solution.ts)| Easy | Top_Interview_Questions, Hash_Table, Math, Two_Pointers | 0 | 100.00
@@ -1097,6 +1102,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| | | | | |
|-|-|-|-|-|-
+| 0228 |[Summary Ranges](src/main/ts/g0201_0300/s0228_summary_ranges/solution.ts)| Easy | Array | 0 | 100.00
| 0056 |[Merge Intervals](src/main/ts/g0001_0100/s0056_merge_intervals/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Sorting, Big_O_Time_O(n_log_n)_Space_O(n) | 7 | 87.99
| 0057 |[Insert Interval](src/main/ts/g0001_0100/s0057_insert_interval/solution.ts)| Medium | Array | 0 | 100.00
@@ -1108,6 +1114,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| 0071 |[Simplify Path](src/main/ts/g0001_0100/s0071_simplify_path/solution.ts)| Medium | String, Stack | 0 | 100.00
| 0155 |[Min Stack](src/main/ts/g0101_0200/s0155_min_stack/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Stack, Design, Big_O_Time_O(1)_Space_O(N) | 5 | 99.10
| 0150 |[Evaluate Reverse Polish Notation](src/main/ts/g0101_0200/s0150_evaluate_reverse_polish_notation/solution.ts)| Medium | Top_Interview_Questions, Array, Math, Stack | 1 | 97.48
+| 0224 |[Basic Calculator](src/main/ts/g0201_0300/s0224_basic_calculator/solution.ts)| Hard | String, Math, Stack, Recursion | 6 | 96.62
#### Top Interview 150 Linked List
@@ -1178,7 +1185,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
|-|-|-|-|-|-
| 0208 |[Implement Trie (Prefix Tree)](src/main/ts/g0201_0300/s0208_implement_trie_prefix_tree/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, String, Hash_Table, Design, Trie, Big_O_Time_O(word.length())_or_O(prefix.length())_Space_O(N) | 48 | 63.95
| 0211 |[Design Add and Search Words Data Structure](src/main/ts/g0201_0300/s0211_design_add_and_search_words_data_structure/solution.ts)| Medium | String, Depth_First_Search, Design, Trie | 450 | 92.88
-| 0212 |[Word Search II](src/main/ts/g0201_0300/s0212_word_search_ii/solution.ts)| Hard | Top_Interview_Questions, Array, String, Matrix, Backtracking, Trie | ew 150 | ew 150 Trie
+| 0212 |[Word Search II](src/main/ts/g0201_0300/s0212_word_search_ii/solution.ts)| Hard | Top_Interview_Questions, Array, String, Matrix, Backtracking, Trie | 62 | 99.46
#### Top Interview 150 Backtracking
@@ -1308,6 +1315,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| | | | | |
|-|-|-|-|-|-
+| 0242 |[Valid Anagram](src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts)| Easy | String, Hash_Table, Sorting | 4 | 97.99
#### Day 7 Linked List
@@ -1405,6 +1413,7 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| | | | | |
|-|-|-|-|-|-
+| 0290 |[Word Pattern](src/main/ts/g0201_0300/s0290_word_pattern/solution.ts)| Easy | String, Hash_Table | 0 | 100.00
| 0763 |[Partition Labels](src/main/ts/g0701_0800/s0763_partition_labels/solution.ts)| Medium | String, Hash_Table, Greedy, Two_Pointers, Big_O_Time_O(n)_Space_O(1) | 4 | 86.89
#### Day 8 String
@@ -1739,20 +1748,25 @@ TypeScript-based LeetCode algorithm problem solutions, regularly updated.
| 0322 |[Coin Change](src/main/ts/g0301_0400/s0322_coin_change/solution.ts)| Medium | Top_100_Liked_Questions, Array, Dynamic_Programming, Breadth_First_Search, Algorithm_II_Day_18_Dynamic_Programming, Dynamic_Programming_I_Day_20, Level_2_Day_12_Dynamic_Programming, Top_Interview_150_1D_DP, Big_O_Time_O(m\*n)_Space_O(amount) | 27 | 89.42
| 0300 |[Longest Increasing Subsequence](src/main/ts/g0201_0300/s0300_longest_increasing_subsequence/solution.ts)| Medium | Top_100_Liked_Questions, Array, Dynamic_Programming, Binary_Search, Algorithm_II_Day_16_Dynamic_Programming, Binary_Search_II_Day_3, Dynamic_Programming_I_Day_18, Udemy_Dynamic_Programming, Top_Interview_150_1D_DP, Big_O_Time_O(n\*log_n)_Space_O(n) | 6 | 84.68
| 0295 |[Find Median from Data Stream](src/main/ts/g0201_0300/s0295_find_median_from_data_stream/solution.ts)| Hard | Top_100_Liked_Questions, Sorting, Two_Pointers, Design, Heap_Priority_Queue, Data_Stream, Top_Interview_150_Heap, Big_O_Time_O(n\*log_n)_Space_O(n) | 106 | 92.31
+| 0290 |[Word Pattern](src/main/ts/g0201_0300/s0290_word_pattern/solution.ts)| Easy | String, Hash_Table, Data_Structure_II_Day_7_String, Top_Interview_150_Hashmap | 0 | 100.00
+| 0289 |[Game of Life](src/main/ts/g0201_0300/s0289_game_of_life/solution.ts)| Medium | Array, Matrix, Simulation, Top_Interview_150_Matrix | 0 | 100.00
| 0287 |[Find the Duplicate Number](src/main/ts/g0201_0300/s0287_find_the_duplicate_number/solution.ts)| Medium | Top_100_Liked_Questions, Array, Binary_Search, Two_Pointers, Bit_Manipulation, Binary_Search_II_Day_5, Big_O_Time_O(n)_Space_O(n) | 5 | 88.65
| 0283 |[Move Zeroes](src/main/ts/g0201_0300/s0283_move_zeroes/solution.ts)| Easy | Top_100_Liked_Questions, Array, Two_Pointers, Algorithm_I_Day_3_Two_Pointers, Programming_Skills_I_Day_6_Array, Udemy_Arrays, Big_O_Time_O(n)_Space_O(1) | 1 | 82.86
+| 0242 |[Valid Anagram](src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts)| Easy | String, Hash_Table, Sorting, Data_Structure_I_Day_6_String, Programming_Skills_I_Day_11_Containers_and_Libraries, Udemy_Strings, Top_Interview_150_Hashmap | 4 | 97.99
| 0240 |[Search a 2D Matrix II](src/main/ts/g0201_0300/s0240_search_a_2d_matrix_ii/solution.ts)| Medium | Top_100_Liked_Questions, Array, Binary_Search, Matrix, Divide_and_Conquer, Data_Structure_II_Day_4_Array, Binary_Search_II_Day_8, Big_O_Time_O(n+m)_Space_O(1) | 42 | 94.61
| 0239 |[Sliding Window Maximum](src/main/ts/g0201_0300/s0239_sliding_window_maximum/solution.ts)| Hard | Top_100_Liked_Questions, Array, Heap_Priority_Queue, Sliding_Window, Queue, Monotonic_Queue, Udemy_Arrays, Big_O_Time_O(n\*k)_Space_O(n+k) | 26 | 99.07
| 0238 |[Product of Array Except Self](src/main/ts/g0201_0300/s0238_product_of_array_except_self/solution.ts)| Medium | Top_100_Liked_Questions, Array, Prefix_Sum, Data_Structure_II_Day_5_Array, Udemy_Arrays, Top_Interview_150_Array/String, Big_O_Time_O(n^2)_Space_O(n) | 3 | 92.81
| 0236 |[Lowest Common Ancestor of a Binary Tree](src/main/ts/g0201_0300/s0236_lowest_common_ancestor_of_a_binary_tree/solution.ts)| Medium | Top_100_Liked_Questions, Depth_First_Search, Tree, Binary_Tree, Data_Structure_II_Day_18_Tree, Udemy_Tree_Stack_Queue, Top_Interview_150_Binary_Tree_General, Big_O_Time_O(n)_Space_O(n) | 61 | 75.97
| 0234 |[Palindrome Linked List](src/main/ts/g0201_0300/s0234_palindrome_linked_list/solution.ts)| Easy | Top_100_Liked_Questions, Two_Pointers, Stack, Linked_List, Recursion, Level_2_Day_3_Linked_List, Udemy_Linked_List, Big_O_Time_O(n)_Space_O(1) | 3 | 92.85
| 0230 |[Kth Smallest Element in a BST](src/main/ts/g0201_0300/s0230_kth_smallest_element_in_a_bst/solution.ts)| Medium | Top_100_Liked_Questions, Depth_First_Search, Tree, Binary_Tree, Binary_Search_Tree, Data_Structure_II_Day_17_Tree, Level_2_Day_9_Binary_Search_Tree, Top_Interview_150_Binary_Search_Tree, Big_O_Time_O(n)_Space_O(n) | 0 | 100.00
+| 0228 |[Summary Ranges](src/main/ts/g0201_0300/s0228_summary_ranges/solution.ts)| Easy | Array, Top_Interview_150_Intervals | 0 | 100.00
| 0226 |[Invert Binary Tree](src/main/ts/g0201_0300/s0226_invert_binary_tree/solution.ts)| Easy | Top_100_Liked_Questions, Depth_First_Search, Breadth_First_Search, Tree, Binary_Tree, Data_Structure_I_Day_12_Tree, Level_2_Day_6_Tree, Udemy_Tree_Stack_Queue, Top_Interview_150_Binary_Tree_General, Big_O_Time_O(n)_Space_O(n) | 0 | 100.00
+| 0224 |[Basic Calculator](src/main/ts/g0201_0300/s0224_basic_calculator/solution.ts)| Hard | String, Math, Stack, Recursion, Top_Interview_150_Stack | 6 | 96.62
| 0222 |[Count Complete Tree Nodes](src/main/ts/g0201_0300/s0222_count_complete_tree_nodes/solution.ts)| Easy | Depth_First_Search, Tree, Binary_Search, Binary_Tree, Binary_Search_II_Day_10, Top_Interview_150_Binary_Tree_General | 0 | 100.00
| 0221 |[Maximal Square](src/main/ts/g0201_0300/s0221_maximal_square/solution.ts)| Medium | Array, Dynamic_Programming, Matrix, Dynamic_Programming_I_Day_16, Top_Interview_150_Multidimensional_DP, Big_O_Time_O(m\*n)_Space_O(m\*n) | 18 | 59.02
| 0219 |[Contains Duplicate II](src/main/ts/g0201_0300/s0219_contains_duplicate_ii/solution.ts)| Easy | Array, Hash_Table, Sliding_Window, Top_Interview_150_Hashmap | 17 | 79.29
| 0215 |[Kth Largest Element in an Array](src/main/ts/g0201_0300/s0215_kth_largest_element_in_an_array/solution.ts)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Sorting, Heap_Priority_Queue, Divide_and_Conquer, Quickselect, Data_Structure_II_Day_20_Heap_Priority_Queue, Top_Interview_150_Heap, Big_O_Time_O(n\*log(n))_Space_O(log(n)) | 4 | 99.64
-| 0212 |[Word Search II](src/main/ts/g0201_0300/s0212_word_search_ii/solution.ts)| Hard | Top_Interview_Questions, Array, String, Matrix, Backtracking, Trie | ew 150 | ew 150 Trie
+| 0212 |[Word Search II](src/main/ts/g0201_0300/s0212_word_search_ii/solution.ts)| Hard | Top_Interview_Questions, Array, String, Matrix, Backtracking, Trie, Top_Interview_150_Trie | 62 | 99.46
| 0211 |[Design Add and Search Words Data Structure](src/main/ts/g0201_0300/s0211_design_add_and_search_words_data_structure/solution.ts)| Medium | String, Depth_First_Search, Design, Trie, Top_Interview_150_Trie | 450 | 92.88
| 0210 |[Course Schedule II](src/main/ts/g0201_0300/s0210_course_schedule_ii/solution.ts)| Medium | Top_Interview_Questions, Depth_First_Search, Breadth_First_Search, Graph, Topological_Sort, Level_2_Day_11_Graph/BFS/DFS, Top_Interview_150_Graph_General | 2 | 99.76
| 0209 |[Minimum Size Subarray Sum](src/main/ts/g0201_0300/s0209_minimum_size_subarray_sum/solution.ts)| Medium | Array, Binary_Search, Prefix_Sum, Sliding_Window, Algorithm_II_Day_5_Sliding_Window, Binary_Search_II_Day_1, Top_Interview_150_Sliding_Window | 2 | 88.11
diff --git a/src/main/ts/g0201_0300/s0224_basic_calculator/readme.md b/src/main/ts/g0201_0300/s0224_basic_calculator/readme.md
new file mode 100644
index 0000000..fc89eda
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0224_basic_calculator/readme.md
@@ -0,0 +1,35 @@
+224\. Basic Calculator
+
+Hard
+
+Given a string `s` representing a valid expression, implement a basic calculator to evaluate it, and return _the result of the evaluation_.
+
+**Note:** You are **not** allowed to use any built-in function which evaluates strings as mathematical expressions, such as `eval()`.
+
+**Example 1:**
+
+**Input:** s = "1 + 1"
+
+**Output:** 2
+
+**Example 2:**
+
+**Input:** s = " 2-1 + 2 "
+
+**Output:** 3
+
+**Example 3:**
+
+**Input:** s = "(1+(4+5+2)-3)+(6+8)"
+
+**Output:** 23
+
+**Constraints:**
+
+* 1 <= s.length <= 3 * 105
+* `s` consists of digits, `'+'`, `'-'`, `'('`, `')'`, and `' '`.
+* `s` represents a valid expression.
+* `'+'` is **not** used as a unary operation (i.e., `"+1"` and `"+(2 + 3)"` is invalid).
+* `'-'` could be used as a unary operation (i.e., `"-1"` and `"-(2 + 3)"` is valid).
+* There will be no two consecutive operators in the input.
+* Every number and running calculation will fit in a signed 32-bit integer.
diff --git a/src/main/ts/g0201_0300/s0224_basic_calculator/solution.ts b/src/main/ts/g0201_0300/s0224_basic_calculator/solution.ts
new file mode 100644
index 0000000..811c88f
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0224_basic_calculator/solution.ts
@@ -0,0 +1,39 @@
+// #Hard #String #Math #Stack #Recursion #Top_Interview_150_Stack
+// #2025_04_12_Time_6_ms_(96.62%)_Space_57.57_MB_(89.85%)
+
+function calculate(s: string): number {
+ let i = 0
+
+ function helper(ca: string[]): number {
+ let num = 0
+ let prenum = 0
+ let isPlus = true
+ while (i < ca.length) {
+ const c = ca[i]
+ if (c !== ' ') {
+ if (c >= '0' && c <= '9') {
+ num = num * 10 + parseInt(c)
+ } else if (c === '+') {
+ prenum += num * (isPlus ? 1 : -1)
+ isPlus = true
+ num = 0
+ } else if (c === '-') {
+ prenum += num * (isPlus ? 1 : -1)
+ isPlus = false
+ num = 0
+ } else if (c === '(') {
+ i++
+ num = helper(ca)
+ } else if (c === ')') {
+ prenum += num * (isPlus ? 1 : -1)
+ return prenum
+ }
+ }
+ i++
+ }
+ return prenum + num * (isPlus ? 1 : -1)
+ }
+ return helper(s.split(''))
+}
+
+export { calculate }
diff --git a/src/main/ts/g0201_0300/s0228_summary_ranges/readme.md b/src/main/ts/g0201_0300/s0228_summary_ranges/readme.md
new file mode 100644
index 0000000..e8593fb
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0228_summary_ranges/readme.md
@@ -0,0 +1,53 @@
+228\. Summary Ranges
+
+Easy
+
+You are given a **sorted unique** integer array `nums`.
+
+Return _the **smallest sorted** list of ranges that **cover all the numbers in the array exactly**_. That is, each element of `nums` is covered by exactly one of the ranges, and there is no integer `x` such that `x` is in one of the ranges but not in `nums`.
+
+Each range `[a,b]` in the list should be output as:
+
+* `"a->b"` if `a != b`
+* `"a"` if `a == b`
+
+**Example 1:**
+
+**Input:** nums = [0,1,2,4,5,7]
+
+**Output:** ["0->2","4->5","7"]
+
+**Explanation:** The ranges are: [0,2] --> "0->2" [4,5] --> "4->5" [7,7] --> "7"
+
+**Example 2:**
+
+**Input:** nums = [0,2,3,4,6,8,9]
+
+**Output:** ["0","2->4","6","8->9"]
+
+**Explanation:** The ranges are: [0,0] --> "0" [2,4] --> "2->4" [6,6] --> "6" [8,9] --> "8->9"
+
+**Example 3:**
+
+**Input:** nums = []
+
+**Output:** []
+
+**Example 4:**
+
+**Input:** nums = [-1]
+
+**Output:** ["-1"]
+
+**Example 5:**
+
+**Input:** nums = [0]
+
+**Output:** ["0"]
+
+**Constraints:**
+
+* `0 <= nums.length <= 20`
+* -231 <= nums[i] <= 231 - 1
+* All the values of `nums` are **unique**.
+* `nums` is sorted in ascending order.
diff --git a/src/main/ts/g0201_0300/s0228_summary_ranges/solution.ts b/src/main/ts/g0201_0300/s0228_summary_ranges/solution.ts
new file mode 100644
index 0000000..347c551
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0228_summary_ranges/solution.ts
@@ -0,0 +1,34 @@
+// #Easy #Array #Top_Interview_150_Intervals #2025_04_12_Time_0_ms_(100.00%)_Space_55.25_MB_(57.62%)
+
+function summaryRanges(nums: number[]): string[] {
+ const ranges: string[] = []
+ const n = nums.length
+ if (n === 0) {
+ return ranges
+ }
+ let a = nums[0]
+ let b = a
+ let strB = ''
+ for (let i = 1; i < n; i++) {
+ if (nums[i] !== b + 1) {
+ strB = a.toString()
+ if (a !== b) {
+ strB += '->' + b.toString()
+ }
+ ranges.push(strB)
+ a = nums[i]
+ b = a
+ strB = ''
+ } else {
+ b++
+ }
+ }
+ strB = a.toString()
+ if (a !== b) {
+ strB += '->' + b.toString()
+ }
+ ranges.push(strB)
+ return ranges
+}
+
+export { summaryRanges }
diff --git a/src/main/ts/g0201_0300/s0242_valid_anagram/readme.md b/src/main/ts/g0201_0300/s0242_valid_anagram/readme.md
new file mode 100644
index 0000000..417acc0
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0242_valid_anagram/readme.md
@@ -0,0 +1,24 @@
+242\. Valid Anagram
+
+Easy
+
+Given two strings `s` and `t`, return `true` _if_ `t` _is an anagram of_ `s`_, and_ `false` _otherwise_.
+
+**Example 1:**
+
+**Input:** s = "anagram", t = "nagaram"
+
+**Output:** true
+
+**Example 2:**
+
+**Input:** s = "rat", t = "car"
+
+**Output:** false
+
+**Constraints:**
+
+* 1 <= s.length, t.length <= 5 * 104
+* `s` and `t` consist of lowercase English letters.
+
+**Follow up:** What if the inputs contain Unicode characters? How would you adapt your solution to such a case?
diff --git a/src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts b/src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts
new file mode 100644
index 0000000..936a93e
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0242_valid_anagram/solution.ts
@@ -0,0 +1,17 @@
+// #Easy #String #Hash_Table #Sorting #Data_Structure_I_Day_6_String
+// #Programming_Skills_I_Day_11_Containers_and_Libraries #Udemy_Strings #Top_Interview_150_Hashmap
+// #2025_04_12_Time_4_ms_(97.99%)_Space_57.08_MB_(80.13%)
+
+function isAnagram(s: string, t: string): boolean {
+ if (s.length !== t.length) {
+ return false
+ }
+ let counts = new Array(26).fill(0)
+ for (let i = 0; i < s.length; ++i) {
+ counts[s.charCodeAt(i) - 'a'.charCodeAt(0)]++
+ counts[t.charCodeAt(i) - 'a'.charCodeAt(0)]--
+ }
+ return counts.every((c) => c === 0)
+}
+
+export { isAnagram }
diff --git a/src/main/ts/g0201_0300/s0289_game_of_life/readme.md b/src/main/ts/g0201_0300/s0289_game_of_life/readme.md
new file mode 100644
index 0000000..1f38ba1
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0289_game_of_life/readme.md
@@ -0,0 +1,42 @@
+289\. Game of Life
+
+Medium
+
+According to [Wikipedia's article](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life): "The **Game of Life**, also known simply as **Life**, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."
+
+The board is made up of an `m x n` grid of cells, where each cell has an initial state: **live** (represented by a `1`) or **dead** (represented by a `0`). Each cell interacts with its [eight neighbors](https://en.wikipedia.org/wiki/Moore_neighborhood) (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):
+
+1. Any live cell with fewer than two live neighbors dies as if caused by under-population.
+2. Any live cell with two or three live neighbors lives on to the next generation.
+3. Any live cell with more than three live neighbors dies, as if by over-population.
+4. Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
+
+The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously. Given the current state of the `m x n` grid `board`, return _the next state_.
+
+**Example 1:**
+
+
+
+**Input:** board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
+
+**Output:** [[0,0,0],[1,0,1],[0,1,1],[0,1,0]]
+
+**Example 2:**
+
+
+
+**Input:** board = [[1,1],[1,0]]
+
+**Output:** [[1,1],[1,1]]
+
+**Constraints:**
+
+* `m == board.length`
+* `n == board[i].length`
+* `1 <= m, n <= 25`
+* `board[i][j]` is `0` or `1`.
+
+**Follow up:**
+
+* Could you solve it in-place? Remember that the board needs to be updated simultaneously: You cannot update some cells first and then use their updated values to update other cells.
+* In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches upon the border of the array (i.e., live cells reach the border). How would you address these problems?
diff --git a/src/main/ts/g0201_0300/s0289_game_of_life/solution.ts b/src/main/ts/g0201_0300/s0289_game_of_life/solution.ts
new file mode 100644
index 0000000..87a148f
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0289_game_of_life/solution.ts
@@ -0,0 +1,40 @@
+// #Medium #Array #Matrix #Simulation #Top_Interview_150_Matrix
+// #2025_04_12_Time_0_ms_(100.00%)_Space_53.84_MB_(79.20%)
+
+/**
+ * Do not return anything, modify board in-place instead.
+ */
+function gameOfLife(board: number[][]): void {
+ const m = board.length
+ const n = board[0].length
+
+ for (let i = 0; i < m; i++) {
+ for (let j = 0; j < n; j++) {
+ const liveNeighbors = countLives(board, i, j, m, n)
+ if (board[i][j] === 0 && liveNeighbors === 3) {
+ board[i][j] = 2
+ } else if (board[i][j] === 1 && (liveNeighbors === 2 || liveNeighbors === 3)) {
+ board[i][j] = 3
+ }
+ }
+ }
+
+ for (let i = 0; i < m; i++) {
+ for (let j = 0; j < n; j++) {
+ board[i][j] >>= 1
+ }
+ }
+}
+
+function countLives(board: number[][], i: number, j: number, m: number, n: number): number {
+ let lives = 0
+ for (let r = Math.max(0, i - 1); r <= Math.min(m - 1, i + 1); r++) {
+ for (let c = Math.max(0, j - 1); c <= Math.min(n - 1, j + 1); c++) {
+ lives += board[r][c] & 1
+ }
+ }
+ lives -= board[i][j] & 1
+ return lives
+}
+
+export { gameOfLife }
diff --git a/src/main/ts/g0201_0300/s0290_word_pattern/readme.md b/src/main/ts/g0201_0300/s0290_word_pattern/readme.md
new file mode 100644
index 0000000..f69f9f9
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0290_word_pattern/readme.md
@@ -0,0 +1,40 @@
+290\. Word Pattern
+
+Easy
+
+Given a `pattern` and a string `s`, find if `s` follows the same pattern.
+
+Here **follow** means a full match, such that there is a bijection between a letter in `pattern` and a **non-empty** word in `s`.
+
+**Example 1:**
+
+**Input:** pattern = "abba", s = "dog cat cat dog"
+
+**Output:** true
+
+**Example 2:**
+
+**Input:** pattern = "abba", s = "dog cat cat fish"
+
+**Output:** false
+
+**Example 3:**
+
+**Input:** pattern = "aaaa", s = "dog cat cat dog"
+
+**Output:** false
+
+**Example 4:**
+
+**Input:** pattern = "abba", s = "dog dog dog dog"
+
+**Output:** false
+
+**Constraints:**
+
+* `1 <= pattern.length <= 300`
+* `pattern` contains only lower-case English letters.
+* `1 <= s.length <= 3000`
+* `s` contains only lower-case English letters and spaces `' '`.
+* `s` **does not contain** any leading or trailing spaces.
+* All the words in `s` are separated by a **single space**.
diff --git a/src/main/ts/g0201_0300/s0290_word_pattern/solution.ts b/src/main/ts/g0201_0300/s0290_word_pattern/solution.ts
new file mode 100644
index 0000000..068c6b8
--- /dev/null
+++ b/src/main/ts/g0201_0300/s0290_word_pattern/solution.ts
@@ -0,0 +1,27 @@
+// #Easy #String #Hash_Table #Data_Structure_II_Day_7_String #Top_Interview_150_Hashmap
+// #2025_04_12_Time_0_ms_(100.00%)_Space_55.01_MB_(70.10%)
+
+function wordPattern(pattern: string, s: string): boolean {
+ const map = new Map();
+ const words = s.split(" ");
+ if (words.length !== pattern.length) {
+ return false;
+ }
+ for (let i = 0; i < pattern.length; i++) {
+ const char = pattern[i];
+ const word = words[i];
+ if (!map.has(char)) {
+ if ([...map.values()].includes(word)) {
+ return false;
+ }
+ map.set(char, word);
+ } else {
+ if (map.get(char) !== word) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+export { wordPattern }
diff --git a/src/test/ts/g0201_0300/s0224_basic_calculator/solution.test.ts b/src/test/ts/g0201_0300/s0224_basic_calculator/solution.test.ts
new file mode 100644
index 0000000..dfab961
--- /dev/null
+++ b/src/test/ts/g0201_0300/s0224_basic_calculator/solution.test.ts
@@ -0,0 +1,15 @@
+// tslint:disable:no-magic-numbers
+import { calculate } from 'src/main/ts/g0201_0300/s0224_basic_calculator/solution'
+import { expect, test } from 'vitest'
+
+test('calculate', () => {
+ expect(calculate('1 + 1')).toEqual(2)
+})
+
+test('calculate2', () => {
+ expect(calculate(' 2-1 + 2 ')).toEqual(3)
+})
+
+test('calculate3', () => {
+ expect(calculate('(1+(4+5+2)-3)+(6+8)')).toEqual(23)
+})
diff --git a/src/test/ts/g0201_0300/s0228_summary_ranges/solution.test.ts b/src/test/ts/g0201_0300/s0228_summary_ranges/solution.test.ts
new file mode 100644
index 0000000..d70b76e
--- /dev/null
+++ b/src/test/ts/g0201_0300/s0228_summary_ranges/solution.test.ts
@@ -0,0 +1,11 @@
+// tslint:disable:no-magic-numbers
+import { summaryRanges } from 'src/main/ts/g0201_0300/s0228_summary_ranges/solution'
+import { expect, test } from 'vitest'
+
+test('summaryRanges', () => {
+ expect(summaryRanges([0, 1, 2, 4, 5, 7])).toEqual(['0->2', '4->5', '7'])
+})
+
+test('summaryRanges2', () => {
+ expect(summaryRanges([0, 2, 3, 4, 6, 8, 9])).toEqual(['0', '2->4', '6', '8->9'])
+})
diff --git a/src/test/ts/g0201_0300/s0242_valid_anagram/solution.test.ts b/src/test/ts/g0201_0300/s0242_valid_anagram/solution.test.ts
new file mode 100644
index 0000000..99c010f
--- /dev/null
+++ b/src/test/ts/g0201_0300/s0242_valid_anagram/solution.test.ts
@@ -0,0 +1,11 @@
+// tslint:disable:no-magic-numbers
+import { isAnagram } from 'src/main/ts/g0201_0300/s0242_valid_anagram/solution'
+import { expect, test } from 'vitest'
+
+test('isAnagram', () => {
+ expect(isAnagram('anagram', 'nagaram')).toEqual(true)
+})
+
+test('isAnagram2', () => {
+ expect(isAnagram('rat', 'car')).toEqual(false)
+})
diff --git a/src/test/ts/g0201_0300/s0289_game_of_life/solution.test.ts b/src/test/ts/g0201_0300/s0289_game_of_life/solution.test.ts
new file mode 100644
index 0000000..03f4c33
--- /dev/null
+++ b/src/test/ts/g0201_0300/s0289_game_of_life/solution.test.ts
@@ -0,0 +1,31 @@
+// tslint:disable:no-magic-numbers
+import { gameOfLife } from 'src/main/ts/g0201_0300/s0289_game_of_life/solution'
+import { expect, test } from 'vitest'
+
+test('gameOfLife', () => {
+ const board = [
+ [0, 1, 0],
+ [0, 0, 1],
+ [1, 1, 1],
+ [0, 0, 0],
+ ]
+ gameOfLife(board)
+ expect(board).toEqual([
+ [0, 0, 0],
+ [1, 0, 1],
+ [0, 1, 1],
+ [0, 1, 0],
+ ])
+})
+
+test('gameOfLife2', () => {
+ const board = [
+ [1, 1],
+ [1, 0],
+ ]
+ gameOfLife(board)
+ expect(board).toEqual([
+ [1, 1],
+ [1, 1],
+ ])
+})
diff --git a/src/test/ts/g0201_0300/s0290_word_pattern/solution.test.ts b/src/test/ts/g0201_0300/s0290_word_pattern/solution.test.ts
new file mode 100644
index 0000000..2f1d6f2
--- /dev/null
+++ b/src/test/ts/g0201_0300/s0290_word_pattern/solution.test.ts
@@ -0,0 +1,15 @@
+// tslint:disable:no-magic-numbers
+import { wordPattern } from 'src/main/ts/g0201_0300/s0290_word_pattern/solution'
+import { expect, test } from 'vitest'
+
+test('wordPattern', () => {
+ expect(wordPattern('abba', 'dog cat cat dog')).toEqual(true)
+})
+
+test('wordPattern2', () => {
+ expect(wordPattern('abba', 'dog cat cat fish')).toEqual(false)
+})
+
+test('wordPattern3', () => {
+ expect(wordPattern('aaaa', 'dog cat cat dog')).toEqual(false)
+})