diff --git a/.vscode/settings.json b/.vscode/settings.json
index 808d888..fe576cb 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -21,6 +21,7 @@
"nums",
"powx",
"pwwkew",
+ "qian",
"subarray",
"subarrays",
"umghlrlose",
diff --git a/README.md b/README.md
index 47d043c..3943e4c 100644
--- a/README.md
+++ b/README.md
@@ -95,6 +95,11 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
- LeetCode 1108. IP 地址无效化
+- [最长回文子串](src/string/longest-palindromic-substring.js)
+
+ - LeetCode 5. 最长回文子串
+ - LintCode 200. 最长回文子串
+
- [每个元音包含偶数次的最长子字符串](src/string/find-the-longest-substring-containing-vowels-in-even-counts.js)
- LeetCode 1371. 每个元音包含偶数次的最长子字符串
diff --git a/src/string/longest-palindromic-substring.js b/src/string/longest-palindromic-substring.js
new file mode 100644
index 0000000..80f9030
--- /dev/null
+++ b/src/string/longest-palindromic-substring.js
@@ -0,0 +1,36 @@
+export const longestPalindrome = function (s) {
+ if (!s || !s.trim()) return ''
+ if (s.length === 1) return s
+ if (s.length === 2) return s[0] === s[1] ? s[0] + s[1] : s[1]
+ let result = ''
+ /**
+ *扩散坐标
+ */
+ const calPalindromeIndex = function (left, right, s) {
+ const len = s.length
+ while (left >= 0 && right < len && s[left] === s[right]) {
+ left--
+ right++
+ }
+ return { left: left + 1, right: right }
+ }
+ for (let i = 0, len = s.length; i < len; i++) {
+ let even = ''
+ let odd = ''
+ if (s[i] === s[i + 1]) {
+ // 经过当前位与下一位判断已构成回文,扩散位直接从下一位开始,可以提速
+ const evenIndex = calPalindromeIndex(i - 1, i + 2, s)
+ even = s.slice(evenIndex.left, evenIndex.right)
+ }
+ const oddIndex = calPalindromeIndex(i - 1, i + 1, s)
+ odd = s.slice(oddIndex.left, oddIndex.right)
+ const re = odd.length > even.length ? odd : even
+ result = result.length > re.length ? result : re
+ }
+ return result
+}
+
+// 作者:liu-zi-qian-2
+// 链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/5-zui-chang-hui-wen-zi-chuan-by-liu-zi-qian-2/
+// 来源:力扣(LeetCode)
+// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
diff --git a/test/string/longest-palindromic-substring.test.js b/test/string/longest-palindromic-substring.test.js
new file mode 100644
index 0000000..665e09f
--- /dev/null
+++ b/test/string/longest-palindromic-substring.test.js
@@ -0,0 +1,6 @@
+import { longestPalindrome } from '../../src/string/longest-palindromic-substring'
+
+test('最长回文字符串', () => {
+ expect(longestPalindrome('babad')).toBe('aba') // bab也是有效答案
+ expect(longestPalindrome('cbbd')).toBe('bb')
+})