📂
LeetCode Note
  • Introduction
  • Tools
    • Clean Code
    • 英文小辭典
    • JS Reference
    • 常見 Edge Case
    • Array Method
    • Object Method
    • Function
    • Hashing
    • Prototype
    • 處理 Array 小撇步
    • String Method
    • Math / Date
    • loop
    • JSON.xx / localStorage
    • Date
    • Regex
    • Memorization
    • reduce condition
    • 命名
  • 筆記 Note
    • Promise
    • Walking the DOM
    • Element size and scrolling
    • CSS
  • Leetcode todo
    • ToDo
  • Array
    • # Select random poker without duplicates
    • # 最少替換達成不連續字串
    • # 724 Find Pivot Index
    • # 747. Largest Number At Least Twice of Others
    • # 01 getMaxProfit
    • # maxOfBiggestVal
    • # findSecondLargest
    • # 41 First Missing Positive
    • # 134 Gas Station (有圖)
    • # 202 Happy Number
    • # 344 Reverse String
    • # 412 Fizz Buzz
    • # 561 Array Partition I
    • # 804 Unique Morse Code Words
    • # 905 Sort Array By Parity
    • # 121. Best Time to Buy and Sell Stock.js
    • # 122 Best Time to Buy and Sell Stock II
    • # 189 Rotate Array
    • # 229 Majority Element II
    • # 268 Missing Number.
    • # 299 Bulls and Cows (有圖)
    • # 896 Monotonic Array
    • # 1002 Find Common Characters
    • # 1051 Height Checker
    • # 1185 Day of the Week
    • # 169 Majority Element
    • # 605. Can Place Flowers
    • # 350 Intersection of Two Arrays II (有圖)
    • # 482. License Key Formatting
  • Set / Map
    • # GetLengthOfLongestSubstring
    • #1 Two Sum
    • # 217 Contains Duplicate
    • # 1122 Relative Sort Array
    • # 1160 Find Words That Can Be Formed by Characters
    • #811 Subdomain Visit Count
    • # 349 Intersection of Two Arrays
    • # 819 Most Common Word
  • Two Pointer
    • #704. Binary Search
    • #26 Remove Duplicates from Sorted Array (有圖)
    • #27 Remove Element
    • # 66 Plus One
    • # 80 Remove Duplicates from Sorted Array II (有圖)
    • # 88 Merge Sorted Array (有圖)
    • # 125 Valid Palindrome
    • #167 Two Sum II - Input array is sorted (有圖)
    • # 283 Move Zeroes (有圖)
    • # 38 Count and Say
    • # 557. Reverse Words in a String III
    • #977 Squares of a Sorted Array
    • #209 Minimum Size Subarray Sum
  • String
    • # 13 Roman to Integer (有圖)
    • # 771 Jewels and Stones
    • # 937 Reorder Data in Log Files
    • # 929 Unique Email Addresses
    • # 1108 Defanging an IP Address
    • #14 Longest Common Prefix
    • # 387 First Unique Character in a String (有圖)
    • #193 Valid Phone Numbers
    • # 28 Implement strStr()
    • #383 Ransom Note
  • Stack
    • # 20 Valid Parentheses (有圖)
    • # 155 Min Stack
    • BF 165. remove characters
    • #1047 Remove All Adjacent Duplicates In String
  • Binary Search
    • # 1064 Fixed Point (有圖)
    • # 852 Peak Index in a Mountain Array
  • Recursion 遞迴
    • #2625. Flatten Deeply Nested Array
  • Math
    • # 7 Reverse Integer
    • # 9 Palindrome Number (有圖)
    • #53 Maximum Subarray (有圖)
    • # 1085 Sum of Digits in the Minimum Number.
    • # 136 Single Number
    • # 204 Count Primes (有圖)
    • #243 Shortest Word Distance
  • Dynamic Programing
    • # 322 Coin Change
    • # 509 Fibonacci Number (有圖)
    • # 70 Climbing Stairs
    • # 198 House Robber
    • # 168. Excel Sheet Column Title
  • Others
    • # 205. Isomorphic Strings
    • Implement js Array method
    • Flatten Array/Object
  • Matrix
    • 867. Transpose Matrix
  • Queue
    • DOM tree with queue
  • 排序
    • Different Sort
Powered by GitBook
On this page
  • Edge Case
  • 怎麼解
  • 完整程式碼

Was this helpful?

  1. String

#14 Longest Common Prefix

startsWith 請把邏輯寫在紙上會更清楚,因為直接寫 code 思考會常常亂掉 / 這題 Edge Case 很多,值得再寫一次

Previous# 1108 Defanging an IP AddressNext# 387 First Unique Character in a String (有圖)

Last updated 9 months ago

Was this helpful?

再

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

input: 給一字串陣列
output: 找出他們共同 prefix,沒有的話就回傳空字串 ""
Example 1:

Input: ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.
Note:

All given inputs are in lowercase letters a-z.
*/



// Edge Case []
// 只有一個值 ["a"] 那是印 a 還是 ""  (印 "a"")
/**
 * @param {string[]} strs
 * @return {string}
 */
// var longestCommonPrefix = function(strs) {

Edge Case

  • [] 空值

  • ["", "", ""]

  • 有一個值 ["a"] 那是印 a 還是 "" (印 "a"")

怎麼解

本來是這樣想結果整個思緒亂掉

  • 從最左邊開始找 (ind = 0)

    • 遍歷一輪看看所有 item[ind] 是不是一樣 while

    • 一樣的話 ind ++

    • 不一樣的話停止 return prefix

後來這樣改善

  • 想處理 Edge Case

let len = strs.length;

if(len == 0){
    return ""
}else if(len == 1){
    return strs[0];
}
  • 比對前兩個字串,從頭開始取出相同的部分為共同字首

let same = strs[0];
  • 後面的字串只要與目前的共同字首比對即可

  • ['aab', 'aaa', 'ab', 'aa', aa] ,一開始'aab', 'aaa'共同字首前 2 碼'aa'

  • 接下來只要將'aa', 'ab'做比對,發現剩下'a',也就是最長的共同字首

for(let i = 1; i< len; i++){
        let str = strs[i];

        // 取目前的字串 str 跟 same 相等的部分做為新的 same
        let j = 0;
        for(j ; j < same.length ; j++){
            if(same[j] != str.charAt(j)){
                 break;
            } 
         }

         same = same.slice(0, j);
    }
    return same;

完整程式碼

var longestCommonPrefix = function(strs) {
    let len = strs.length;
    // Edge Case
    if(len == 0){
        return ""
    }else if(len == 1){
        return strs[0];
    }
    
    // same 先等於第一個字串
    let same = strs[0];

    for(let i = 1; i< len; i++){
        let str = strs[i];

        // 取目前的字串 str 跟 same 相等的部分做為新的 same
        let j = 0;
        for(j ; j < same.length ; j++){
            if(same[j] != str.charAt(j)){
                 break;
            } 
         }

         same = same.slice(0, j);
    }
    return same;
}
console.log(longestCommonPrefix(["aab","aaa","ab","aa","aa"]))
// faster than 79.67% of JavaScript online submissions 

f

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length === 1) return strs[0]
    
    
    //["flower","flow"]
    function getCommonPrefix(aStr, bStr) {
        let len = Math.min(aStr.length, bStr.length)
        let i = 0;
        let prefix = ""
        
        while( i< len ){
            if(aStr[i] !== bStr[i]){
                return prefix
            }
            prefix += aStr[i]
            i++  
        }
        return prefix
    }
    
    let prefix = getCommonPrefix(strs[0], strs[1])  // "flow"
    for(let i=2;i< strs.length; i++){
        prefix = getCommonPrefix(prefix, strs[i])
    }
    
    return prefix
    
    
};

更好解法

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  let prefix = strs[0]
  let i =1
  while(i<strs.length){
    if(!strs[i].startsWith(prefix)){
        prefix = prefix.slice(0, -1)
    } else {
        i++
    }
  }
  return prefix
};
LeetCode