diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/README.md b/solution/0400-0499/0408.Valid Word Abbreviation/README.md
index 56102a18c56a5..028ff440a3016 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/README.md	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/README.md	
@@ -64,11 +64,21 @@
 
 **方法一:模拟**
 
-模拟字符匹配替换。
+我们可以直接模拟字符匹配替换。
 
-同时遍历 $word$ 和 $abbr$,若 $abbr$ 遇到数字,则 $word$ 跳过对应数字长度的字符数。若数字为空,或者有前导零,则提前返回 false。
+假设字符串 $word$ 和字符串 $abbr$ 的长度分别为 $m$ 和 $n$,我们使用两个指针 $i$ 和 $j$ 分别指向字符串 $word$ 和字符串 $abbr$ 的初始位置,用一个整型变量 $x$ 记录当前匹配到的 $abbr$ 的数字。
 
-时间复杂度 $O(m+n)$,空间复杂度 $O(1)$。其中 $m$ 是 $word$ 的长度,而 $n$ 是 $abbr$ 的长度。
+循环匹配字符串 $word$ 和字符串 $abbr$ 的每个字符:
+
+如果指针 $j$ 指向的字符 $abbr[j]$ 是数字,如果 $abbr[j]$ 是 `'0'`,并且 $x$ 为 $0$,说明 $abbr$ 中的数字含有前导零,因此不是合法的缩写,返回 `false`;否则将 $x$ 更新为 $x \times 10 + abbr[j] - '0'$。
+
+如果指针 $j$ 指向的字符 $abbr[j]$ 不是数字,那么我们此时将指针 $i$ 往前移动 $x$ 个位置,然后将 $x$ 重置为 $0$。如果此时 $i \geq m$ 或者 $word[i] \neq abbr[j]$,说明两个字符串无法匹配,返回 `false`;否则将指针 $i$ 往前移动 $1$ 个位置。
+
+然后我们将指针 $j$ 往前移动 $1$ 个位置,重复上述过程,直到 $i$ 超出字符串 $word$ 的长度或者 $j$ 超出字符串 $abbr$ 的长度。
+
+最后,如果 $i + x$ 等于 $m$ 且 $j$ 等于 $n$,说明字符串 $word$ 可以缩写成字符串 $abbr$,返回 `true`;否则返回 `false`。
+
+时间复杂度 $O(m + n)$,其中 $m$ 和 $n$ 分别是字符串 $word$ 和字符串 $abbr$ 的长度。空间复杂度 $O(1)$。
 
 <!-- tabs:start -->
 
@@ -79,23 +89,21 @@
 ```python
 class Solution:
     def validWordAbbreviation(self, word: str, abbr: str) -> bool:
-        i = j = 0
         m, n = len(word), len(abbr)
-        while i < m:
-            if j >= n:
-                return False
-            if word[i] == abbr[j]:
-                i, j = i + 1, j + 1
-                continue
-            k = j
-            while k < n and abbr[k].isdigit():
-                k += 1
-            t = abbr[j:k]
-            if not t.isdigit() or t[0] == '0' or int(t) == 0:
-                return False
-            i += int(t)
-            j = k
-        return i == m and j == n
+        i = j = x = 0
+        while i < m and j < n:
+            if abbr[j].isdigit():
+                if abbr[j] == "0" and x == 0:
+                    return False
+                x = x * 10 + int(abbr[j])
+            else:
+                i += x
+                x = 0
+                if i >= m or word[i] != abbr[j]:
+                    return False
+                i += 1
+            j += 1
+        return i + x == m and j == n
 ```
 
 ### **Java**
@@ -106,28 +114,24 @@ class Solution:
 class Solution {
     public boolean validWordAbbreviation(String word, String abbr) {
         int m = word.length(), n = abbr.length();
-        int i = 0, j = 0;
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word.charAt(i) == abbr.charAt(j)) {
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            char c = abbr.charAt(j);
+            if (Character.isDigit(c)) {
+                if (c == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (c - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word.charAt(i) != c) {
+                    return false;
+                }
                 ++i;
-                ++j;
-                continue;
             }
-            int k = j;
-            while (k < n && Character.isDigit(abbr.charAt(k))) {
-                ++k;
-            }
-            String t = abbr.substring(j, k);
-            if (j == k || t.charAt(0) == '0' || Integer.parseInt(t) == 0) {
-                return false;
-            }
-            i += Integer.parseInt(t);
-            j = k;
         }
-        return i == m && j == n;
+        return i + x == m && j == n;
     }
 }
 ```
@@ -138,33 +142,24 @@ class Solution {
 class Solution {
 public:
     bool validWordAbbreviation(string word, string abbr) {
-        int i = 0, j = 0;
         int m = word.size(), n = abbr.size();
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word[i] == abbr[j]) {
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            if (isdigit(abbr[j])) {
+                if (abbr[j] == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (abbr[j] - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word[i] != abbr[j]) {
+                    return false;
+                }
                 ++i;
-                ++j;
-                continue;
-            }
-            int k = j;
-            while (k < n && isdigit(abbr[k])) {
-                ++k;
-            }
-            string t = abbr.substr(j, k - j);
-            if (k == j || t[0] == '0') {
-                return false;
-            }
-            int x = stoi(t);
-            if (x == 0) {
-                return false;
             }
-            i += x;
-            j = k;
         }
-        return i == m && j == n;
+        return i + x == m && j == n;
     }
 };
 ```
@@ -173,32 +168,48 @@ public:
 
 ```go
 func validWordAbbreviation(word string, abbr string) bool {
-	i, j := 0, 0
 	m, n := len(word), len(abbr)
-	for i < m {
-		if j >= n {
-			return false
-		}
-		if word[i] == abbr[j] {
+	i, j, x := 0, 0, 0
+	for ; i < m && j < n; j++ {
+		if abbr[j] >= '0' && abbr[j] <= '9' {
+			if x == 0 && abbr[j] == '0' {
+				return false
+			}
+			x = x*10 + int(abbr[j]-'0')
+		} else {
+			i += x
+			x = 0
+			if i >= m || word[i] != abbr[j] {
+				return false
+			}
 			i++
-			j++
-			continue
-		}
-		k := j
-		for k < n && abbr[k] >= '0' && abbr[k] <= '9' {
-			k++
-		}
-		if k == j || abbr[j] == '0' {
-			return false
 		}
-		x, _ := strconv.Atoi(abbr[j:k])
-		if x == 0 {
-			return false
-		}
-		i += x
-		j = k
 	}
-	return i == m && j == n
+	return i+x == m && j == n
+}
+```
+
+### **TypeScript**
+
+```ts
+function validWordAbbreviation(word: string, abbr: string): boolean {
+    const [m, n] = [word.length, abbr.length];
+    let [i, j, x] = [0, 0, 0];
+    for (; i < m && j < n; ++j) {
+        if (abbr[j] >= '0' && abbr[j] <= '9') {
+            if (abbr[j] === '0' && x === 0) {
+                return false;
+            }
+            x = x * 10 + Number(abbr[j]);
+        } else {
+            i += x;
+            x = 0;
+            if (i >= m || word[i++] !== abbr[j]) {
+                return false;
+            }
+        }
+    }
+    return i + x === m && j === n;
 }
 ```
 
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/README_EN.md b/solution/0400-0499/0408.Valid Word Abbreviation/README_EN.md
index bbc08be8a5381..98cb844e6a709 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/README_EN.md	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/README_EN.md	
@@ -58,6 +58,24 @@
 
 ## Solutions
 
+**Solution 1: Simulation**
+
+We can directly simulate character matching and replacement.
+
+Assume the lengths of the string $word$ and the string $abbr$ are $m$ and $n$ respectively. We use two pointers $i$ and $j$ to point to the initial positions of the string $word$ and the string $abbr$ respectively, and use an integer variable $x$ to record the current matched number in $abbr$.
+
+Loop to match each character of the string $word$ and the string $abbr$:
+
+If the character $abbr[j]$ pointed by the pointer $j$ is a number, if $abbr[j]$ is `'0'` and $x$ is $0$, it means that the number in $abbr$ has leading zeros, so it is not a valid abbreviation, return `false`; otherwise, update $x$ to $x \times 10 + abbr[j] - '0'$.
+
+If the character $abbr[j]$ pointed by the pointer $j$ is not a number, then we move the pointer $i$ forward by $x$ positions at this time, and then reset $x$ to $0$. If $i \geq m$ or $word[i] \neq abbr[j]$ at this time, it means that the two strings cannot match, return `false`; otherwise, move the pointer $i$ forward by $1$ position.
+
+Then we move the pointer $j$ forward by $1$ position, repeat the above process, until $i$ exceeds the length of the string $word$ or $j$ exceeds the length of the string $abbr$.
+
+Finally, if $i + x$ equals $m$ and $j$ equals $n$, it means that the string $word$ can be abbreviated as the string $abbr$, return `true`; otherwise return `false`.
+
+The time complexity is $O(m + n)$, where $m$ and $n$ are the lengths of the string $word$ and the string $abbr$ respectively. The space complexity is $O(1)$.
+
 <!-- tabs:start -->
 
 ### **Python3**
@@ -65,23 +83,21 @@
 ```python
 class Solution:
     def validWordAbbreviation(self, word: str, abbr: str) -> bool:
-        i = j = 0
         m, n = len(word), len(abbr)
-        while i < m:
-            if j >= n:
-                return False
-            if word[i] == abbr[j]:
-                i, j = i + 1, j + 1
-                continue
-            k = j
-            while k < n and abbr[k].isdigit():
-                k += 1
-            t = abbr[j:k]
-            if not t.isdigit() or t[0] == '0' or int(t) == 0:
-                return False
-            i += int(t)
-            j = k
-        return i == m and j == n
+        i = j = x = 0
+        while i < m and j < n:
+            if abbr[j].isdigit():
+                if abbr[j] == "0" and x == 0:
+                    return False
+                x = x * 10 + int(abbr[j])
+            else:
+                i += x
+                x = 0
+                if i >= m or word[i] != abbr[j]:
+                    return False
+                i += 1
+            j += 1
+        return i + x == m and j == n
 ```
 
 ### **Java**
@@ -90,28 +106,24 @@ class Solution:
 class Solution {
     public boolean validWordAbbreviation(String word, String abbr) {
         int m = word.length(), n = abbr.length();
-        int i = 0, j = 0;
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word.charAt(i) == abbr.charAt(j)) {
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            char c = abbr.charAt(j);
+            if (Character.isDigit(c)) {
+                if (c == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (c - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word.charAt(i) != c) {
+                    return false;
+                }
                 ++i;
-                ++j;
-                continue;
-            }
-            int k = j;
-            while (k < n && Character.isDigit(abbr.charAt(k))) {
-                ++k;
             }
-            String t = abbr.substring(j, k);
-            if (j == k || t.charAt(0) == '0' || Integer.parseInt(t) == 0) {
-                return false;
-            }
-            i += Integer.parseInt(t);
-            j = k;
         }
-        return i == m && j == n;
+        return i + x == m && j == n;
     }
 }
 ```
@@ -122,33 +134,24 @@ class Solution {
 class Solution {
 public:
     bool validWordAbbreviation(string word, string abbr) {
-        int i = 0, j = 0;
         int m = word.size(), n = abbr.size();
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word[i] == abbr[j]) {
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            if (isdigit(abbr[j])) {
+                if (abbr[j] == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (abbr[j] - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word[i] != abbr[j]) {
+                    return false;
+                }
                 ++i;
-                ++j;
-                continue;
-            }
-            int k = j;
-            while (k < n && isdigit(abbr[k])) {
-                ++k;
-            }
-            string t = abbr.substr(j, k - j);
-            if (k == j || t[0] == '0') {
-                return false;
             }
-            int x = stoi(t);
-            if (x == 0) {
-                return false;
-            }
-            i += x;
-            j = k;
         }
-        return i == m && j == n;
+        return i + x == m && j == n;
     }
 };
 ```
@@ -157,32 +160,48 @@ public:
 
 ```go
 func validWordAbbreviation(word string, abbr string) bool {
-	i, j := 0, 0
 	m, n := len(word), len(abbr)
-	for i < m {
-		if j >= n {
-			return false
-		}
-		if word[i] == abbr[j] {
+	i, j, x := 0, 0, 0
+	for ; i < m && j < n; j++ {
+		if abbr[j] >= '0' && abbr[j] <= '9' {
+			if x == 0 && abbr[j] == '0' {
+				return false
+			}
+			x = x*10 + int(abbr[j]-'0')
+		} else {
+			i += x
+			x = 0
+			if i >= m || word[i] != abbr[j] {
+				return false
+			}
 			i++
-			j++
-			continue
-		}
-		k := j
-		for k < n && abbr[k] >= '0' && abbr[k] <= '9' {
-			k++
 		}
-		if k == j || abbr[j] == '0' {
-			return false
-		}
-		x, _ := strconv.Atoi(abbr[j:k])
-		if x == 0 {
-			return false
-		}
-		i += x
-		j = k
 	}
-	return i == m && j == n
+	return i+x == m && j == n
+}
+```
+
+### **TypeScript**
+
+```ts
+function validWordAbbreviation(word: string, abbr: string): boolean {
+    const [m, n] = [word.length, abbr.length];
+    let [i, j, x] = [0, 0, 0];
+    for (; i < m && j < n; ++j) {
+        if (abbr[j] >= '0' && abbr[j] <= '9') {
+            if (abbr[j] === '0' && x === 0) {
+                return false;
+            }
+            x = x * 10 + Number(abbr[j]);
+        } else {
+            i += x;
+            x = 0;
+            if (i >= m || word[i++] !== abbr[j]) {
+                return false;
+            }
+        }
+    }
+    return i + x === m && j === n;
 }
 ```
 
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.cpp b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.cpp
index 7bc36092a0e10..f0c29d1e8366c 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.cpp	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.cpp	
@@ -1,32 +1,23 @@
-class Solution {
-public:
-    bool validWordAbbreviation(string word, string abbr) {
-        int i = 0, j = 0;
-        int m = word.size(), n = abbr.size();
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word[i] == abbr[j]) {
-                ++i;
-                ++j;
-                continue;
-            }
-            int k = j;
-            while (k < n && isdigit(abbr[k])) {
-                ++k;
-            }
-            string t = abbr.substr(j, k - j);
-            if (k == j || t[0] == '0') {
-                return false;
-            }
-            int x = stoi(t);
-            if (x == 0) {
-                return false;
-            }
-            i += x;
-            j = k;
-        }
-        return i == m && j == n;
-    }
+class Solution {
+public:
+    bool validWordAbbreviation(string word, string abbr) {
+        int m = word.size(), n = abbr.size();
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            if (isdigit(abbr[j])) {
+                if (abbr[j] == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (abbr[j] - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word[i] != abbr[j]) {
+                    return false;
+                }
+                ++i;
+            }
+        }
+        return i + x == m && j == n;
+    }
 };
\ No newline at end of file
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.go b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.go
index 0c552cb6b090f..70ddc8f970456 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.go	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.go	
@@ -1,28 +1,20 @@
 func validWordAbbreviation(word string, abbr string) bool {
-	i, j := 0, 0
 	m, n := len(word), len(abbr)
-	for i < m {
-		if j >= n {
-			return false
-		}
-		if word[i] == abbr[j] {
+	i, j, x := 0, 0, 0
+	for ; i < m && j < n; j++ {
+		if abbr[j] >= '0' && abbr[j] <= '9' {
+			if x == 0 && abbr[j] == '0' {
+				return false
+			}
+			x = x*10 + int(abbr[j]-'0')
+		} else {
+			i += x
+			x = 0
+			if i >= m || word[i] != abbr[j] {
+				return false
+			}
 			i++
-			j++
-			continue
-		}
-		k := j
-		for k < n && abbr[k] >= '0' && abbr[k] <= '9' {
-			k++
-		}
-		if k == j || abbr[j] == '0' {
-			return false
-		}
-		x, _ := strconv.Atoi(abbr[j:k])
-		if x == 0 {
-			return false
 		}
-		i += x
-		j = k
 	}
-	return i == m && j == n
+	return i+x == m && j == n
 }
\ No newline at end of file
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.java b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.java
index d490309bff6f9..f74cd5bf78eea 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.java	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.java	
@@ -1,27 +1,23 @@
-class Solution {
-    public boolean validWordAbbreviation(String word, String abbr) {
-        int m = word.length(), n = abbr.length();
-        int i = 0, j = 0;
-        while (i < m) {
-            if (j >= n) {
-                return false;
-            }
-            if (word.charAt(i) == abbr.charAt(j)) {
-                ++i;
-                ++j;
-                continue;
-            }
-            int k = j;
-            while (k < n && Character.isDigit(abbr.charAt(k))) {
-                ++k;
-            }
-            String t = abbr.substring(j, k);
-            if (j == k || t.charAt(0) == '0' || Integer.parseInt(t) == 0) {
-                return false;
-            }
-            i += Integer.parseInt(t);
-            j = k;
-        }
-        return i == m && j == n;
-    }
+class Solution {
+    public boolean validWordAbbreviation(String word, String abbr) {
+        int m = word.length(), n = abbr.length();
+        int i = 0, j = 0, x = 0;
+        for (; i < m && j < n; ++j) {
+            char c = abbr.charAt(j);
+            if (Character.isDigit(c)) {
+                if (c == '0' && x == 0) {
+                    return false;
+                }
+                x = x * 10 + (c - '0');
+            } else {
+                i += x;
+                x = 0;
+                if (i >= m || word.charAt(i) != c) {
+                    return false;
+                }
+                ++i;
+            }
+        }
+        return i + x == m && j == n;
+    }
 }
\ No newline at end of file
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.py b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.py
index a1abc3131d50a..c25bdc3088837 100644
--- a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.py	
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.py	
@@ -1,19 +1,17 @@
-class Solution:
-    def validWordAbbreviation(self, word: str, abbr: str) -> bool:
-        i = j = 0
-        m, n = len(word), len(abbr)
-        while i < m:
-            if j >= n:
-                return False
-            if word[i] == abbr[j]:
-                i, j = i + 1, j + 1
-                continue
-            k = j
-            while k < n and abbr[k].isdigit():
-                k += 1
-            t = abbr[j:k]
-            if not t.isdigit() or t[0] == '0' or int(t) == 0:
-                return False
-            i += int(t)
-            j = k
-        return i == m and j == n
+class Solution:
+    def validWordAbbreviation(self, word: str, abbr: str) -> bool:
+        m, n = len(word), len(abbr)
+        i = j = x = 0
+        while i < m and j < n:
+            if abbr[j].isdigit():
+                if abbr[j] == "0" and x == 0:
+                    return False
+                x = x * 10 + int(abbr[j])
+            else:
+                i += x
+                x = 0
+                if i >= m or word[i] != abbr[j]:
+                    return False
+                i += 1
+            j += 1
+        return i + x == m and j == n
diff --git a/solution/0400-0499/0408.Valid Word Abbreviation/Solution.ts b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.ts
new file mode 100644
index 0000000000000..b0bbf0ae109df
--- /dev/null
+++ b/solution/0400-0499/0408.Valid Word Abbreviation/Solution.ts	
@@ -0,0 +1,19 @@
+function validWordAbbreviation(word: string, abbr: string): boolean {
+    const [m, n] = [word.length, abbr.length];
+    let [i, j, x] = [0, 0, 0];
+    for (; i < m && j < n; ++j) {
+        if (abbr[j] >= '0' && abbr[j] <= '9') {
+            if (abbr[j] === '0' && x === 0) {
+                return false;
+            }
+            x = x * 10 + Number(abbr[j]);
+        } else {
+            i += x;
+            x = 0;
+            if (i >= m || word[i++] !== abbr[j]) {
+                return false;
+            }
+        }
+    }
+    return i + x === m && j === n;
+}
diff --git a/solution/0400-0499/0409.Longest Palindrome/README_EN.md b/solution/0400-0499/0409.Longest Palindrome/README_EN.md
index 0628e416143cf..d0a3d19723200 100644
--- a/solution/0400-0499/0409.Longest Palindrome/README_EN.md	
+++ b/solution/0400-0499/0409.Longest Palindrome/README_EN.md	
@@ -35,6 +35,18 @@
 
 ## Solutions
 
+**Solution 1: Counting**
+
+A valid palindrome string can have at most one character that appears an odd number of times, and the rest of the characters appear an even number of times.
+
+Therefore, we can first traverse the string $s$, count the number of times each character appears, and record it in an array or hash table $cnt$.
+
+Then, we traverse $cnt$, for each character $c$, if $cnt[c]$ is even, then directly add $cnt[c]$ to the answer $ans$; if $cnt[c]$ is odd, then add $cnt[c] - 1$ to $ans$, if $ans$ is even, then increase $ans$ by $1$.
+
+Finally, we return $ans$.
+
+The time complexity is $O(n)$, and the space complexity is $O(C)$. Here, $n$ is the length of the string $s$; and $C$ is the size of the character set, in this problem $C = 128$.
+
 <!-- tabs:start -->
 
 ### **Python3**
diff --git a/solution/0400-0499/0410.Split Array Largest Sum/README.md b/solution/0400-0499/0410.Split Array Largest Sum/README.md
index 565883f1ad2c6..c36e1704b1b4e 100644
--- a/solution/0400-0499/0410.Split Array Largest Sum/README.md	
+++ b/solution/0400-0499/0410.Split Array Largest Sum/README.md	
@@ -54,11 +54,11 @@
 
 我们注意到,当子数组的和的最大值越大,子数组的个数越少,当存在一个满足条件的子数组和的最大值时,那么比这个最大值更大的子数组和的最大值一定也满足条件。也就是说,我们可以对子数组和的最大值进行二分查找,找到满足条件的最小值。
 
-我们定义二分查找的左边界 $left = max(nums)$,右边界 $right = sum(nums)$,然后对于二分查找的每一步,我们取中间值 $mid = (left + right) / 2$,然后判断是否存在一个分割方式,使得子数组的和的最大值不超过 $mid$,如果存在,则说明 $mid$ 可能是满足条件的最小值,因此我们将右边界调整为 $mid$,否则我们将左边界调整为 $mid + 1$。
+我们定义二分查找的左边界 $left = \max(nums)$,右边界 $right = sum(nums)$,然后对于二分查找的每一步,我们取中间值 $mid = \lfloor \frac{left + right}{2} \rfloor$,然后判断是否存在一个分割方式,使得子数组的和的最大值不超过 $mid$,如果存在,则说明 $mid$ 可能是满足条件的最小值,因此我们将右边界调整为 $mid$,否则我们将左边界调整为 $mid + 1$。
 
 我们如何判断是否存在一个分割方式,使得子数组的和的最大值不超过 $mid$ 呢?我们可以使用贪心的方法,从左到右遍历数组,将数组中的元素依次加入到子数组中,如果当前子数组的和大于 $mid$,则我们将当前元素加入到下一个子数组中。如果我们能够将数组分割成不超过 $k$ 个子数组,且每个子数组的和的最大值不超过 $mid$,则说明 $mid$ 是满足条件的最小值,否则 $mid$ 不是满足条件的最小值。
 
-时间复杂度 $O(n \times \log m),空间复杂度 O(1)$。其中 $n$ 和 $m$ 分别是数组的长度和数组所有元素的和。
+时间复杂度 $O(n \times \log m)$,空间复杂度 $O(1)$。其中 $n$ 和 $m$ 分别是数组的长度和数组所有元素的和。
 
 <!-- tabs:start -->
 
diff --git a/solution/0400-0499/0410.Split Array Largest Sum/README_EN.md b/solution/0400-0499/0410.Split Array Largest Sum/README_EN.md
index 8557d0b1ca4e7..61020a00675ad 100644
--- a/solution/0400-0499/0410.Split Array Largest Sum/README_EN.md	
+++ b/solution/0400-0499/0410.Split Array Largest Sum/README_EN.md	
@@ -40,7 +40,15 @@ The best way is to split it into [1,2,3] and [4,5], where the largest sum among
 
 ## Solutions
 
-Binary search.
+**Solution 1: Binary Search**
+
+We notice that the larger the maximum sum of the subarrays, the fewer the number of subarrays. When there is a maximum sum of the subarrays that meets the condition, then a larger maximum sum of the subarrays will definitely meet the condition. This means that we can perform a binary search for the maximum sum of the subarrays to find the smallest value that meets the condition.
+
+We define the left boundary of the binary search as $left = \max(nums)$, and the right boundary as $right = sum(nums)$. Then for each step of the binary search, we take the middle value $mid = \lfloor \frac{left + right}{2} \rfloor$, and then determine whether there is a way to split the array so that the maximum sum of the subarrays does not exceed $mid$. If there is, it means that $mid$ might be the smallest value that meets the condition, so we adjust the right boundary to $mid$. Otherwise, we adjust the left boundary to $mid + 1$.
+
+How do we determine whether there is a way to split the array so that the maximum sum of the subarrays does not exceed $mid$? We can use a greedy method, traverse the array from left to right, and add the elements of the array to the subarray one by one. If the current sum of the subarray is greater than $mid$, then we add the current element to the next subarray. If we can split the array into no more than $k$ subarrays, and the maximum sum of each subarray does not exceed $mid$, then $mid$ is the smallest value that meets the condition. Otherwise, $mid$ does not meet the condition.
+
+The time complexity is $O(n \times \log m)$, and the space complexity is $O(1)$. Here, $n$ and $m$ are the length of the array and the sum of all elements in the array, respectively.
 
 <!-- tabs:start -->