diff --git a/.vscode/settings.json b/.vscode/settings.json
index 0f9d0d1..8f2ef8c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -26,6 +26,8 @@
"preorder",
"pwwkew",
"qian",
+ "racecar",
+ "strs",
"subarray",
"subarrays",
"umghlrlose",
diff --git a/README.md b/README.md
index 7a3a3fb..23ba1a0 100644
--- a/README.md
+++ b/README.md
@@ -117,6 +117,11 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
- LeetCode 5417. 定长子串中元音的最大数目
+- [最长公共前缀](src/string/longest-common-prefix.js)
+
+ - LeetCode 14. 最长公共前缀
+ - LintCode 78. 最长公共前缀
+
## 数组/队列/集合/映射
- [电话号码的字母组合](src/array/letter-combinations-of-a-phone-number.js)
diff --git a/src/string/longest-common-prefix.js b/src/string/longest-common-prefix.js
new file mode 100644
index 0000000..7f61c10
--- /dev/null
+++ b/src/string/longest-common-prefix.js
@@ -0,0 +1,27 @@
+const comp = (left, right, res) => {
+ if (left.length > right.length) {
+ [left, right] = [right, left]
+ }
+
+ res = res || left
+ while (right.indexOf(res) !== 0 && res.length > 0) {
+ res = res.slice(0, res.length - 1)
+ }
+
+ return res
+}
+
+/**
+ * @param {string[]} strs
+ * @return {string}
+ */
+export const longestCommonPrefix = function (strs) {
+ if (strs.length < 2) return strs[0] || ''
+
+ let res = strs[0]
+ for (let i = 1; i < strs.length; i++) {
+ res = comp(res, strs[i])
+ }
+
+ return res
+}
diff --git a/test/string/longest-common-prefix.test.js b/test/string/longest-common-prefix.test.js
new file mode 100644
index 0000000..cbcb8d5
--- /dev/null
+++ b/test/string/longest-common-prefix.test.js
@@ -0,0 +1,8 @@
+import { longestCommonPrefix } from '../../src/string/longest-common-prefix'
+
+test('最长公共前缀', () => {
+ expect(longestCommonPrefix(['flower', 'flow', 'flight'])).toBe('fl')
+ expect(longestCommonPrefix(['dog', 'racecar', 'car'])).toBe('')
+ expect(longestCommonPrefix(['a'])).toBe('a')
+ expect(longestCommonPrefix(['caa', '', 'a', 'acb'])).toBe('')
+})