From a2ccc4764b9db3399b01715c65db37287f941500 Mon Sep 17 00:00:00 2001 From: yige Date: Fri, 22 May 2020 21:25:03 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=9C=80=E9=95=BF=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 1 + README.md | 5 +++ src/string/longest-palindromic-substring.js | 36 +++++++++++++++++++ .../longest-palindromic-substring.test.js | 6 ++++ 4 files changed, 48 insertions(+) create mode 100644 src/string/longest-palindromic-substring.js create mode 100644 test/string/longest-palindromic-substring.test.js 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') +})