演算法-最長公共前綴

01、題目分析

編寫一個函數來查找字元串數組中的最長公共前綴。如果不存在公共前綴,則返回””【leetcode】

示例1

輸入: ["flower","flow","flight"]
輸出: "fl"

示例2

輸入: ["dog","racecar","car"]
輸出: ""

解釋:輸入不存在公共前綴。

02、題解分析

方法1

假定我們現在就從一個數組中尋找最長公共前綴,那麼首先,我們可以將第一個元素設置為基準元素x0。假如數組為[“flow”,”flower”,”flight”],flow就是我們的基準元素base。然後我們只需要依次將基準元素和後面的元素進行比較(假定後面的元素依次為s1,s2,s3….),不斷更新基準元素,直到基準元素和所有元素都滿足最長公共前綴的條件,就可以得到最長公共前綴。
具體比對過程如下:
先申請一塊地址空間commonPrefix,大小是第一個字元串的大小+1,並全置為’\0’。依次將si與base逐個字母比較,當不等時候,將相等部分拷貝到commonPrefix,然後更新bese,最後就是想要的結果(一開始base=flower,flower和flow比較,然後base更新為flow,然後用這個base和s2比較,以此類推)

我們需要注意的是,在處理基準元素的過程中,如果基準元素和任一一個元素無法匹配,則說明不存在最長公共元素。最後,我們記得處理一下臨界條件。如果給定數組是空,也說明沒有最長公共元素。

方法2

先申請一塊地址空間,大小是第一個字元串的大小+1,並全置為’\0’。縱向掃描時,從前往後遍歷所有字元串的每一列,比較相同列上的字元是否相同,如果相同則繼續對下一列進行比較,如果不相同則當前列不再屬於公共前綴,當前列之前的部分為最長公共前綴。

初始狀態

結束狀態

03、題解

方法1

char* longestCommonPrefix(char** strs, int strsLen ) {
  if (strsLen == 0)
    return "";

  if (strsLen == 1)
    return *strs;

  int i, j, k;
  char* base = strs[0];

  char* commonPrefix = (char*)malloc((strlen(base) + 1) * sizeof(char));
  memset(commonPrefix, '\0', strlen(base) + 1);

  for (i = 1; i < strsLen; i++) {
    // j 指向每個字母
    for (j = 0; j < strlen(base); j++) {
      if (strs[i][j] != base[j]) {
        strncpy(commonPrefix, base, j);
          for (k = j; k < strlen(commonPrefix); k++){
            commonPrefix[k] = '\0';
          }
          base = commonPrefix;
      }
    }
  }
  return base;
}

方法2

// 方法2
char * longestCommonPrefix(char ** strs, int strsSize){
  if(strsSize == 0)
    return "";

  if(strsSize == 1)
    return *strs;
  
  //申請7個字元,最後一個存放 '\0' 
  char *commonPrefix = (char *)malloc((strlen(strs[0]) + 1) * sizeof(char)); 
  memset(commonPrefix, '\0', strlen(strs[0]) + 1);  

  int i,j;

  // i分別指向每一個字母  
  for (i = 0; i < strlen(strs[0]); i++) {
    // j 指向每一個單詞 
    char c = strs[0][i];
    for(j = 0; j < strsSize; j++) {
      if(strs[j][i] != c) {
           strncpy(commonPrefix, strs[0], i);
           return commonPrefix;
        }   
    }
  }
  return strs[0];
}

04、測試結果

  int strsLen = 3
  char* strs[strsLen] = {"flow","flower", "flight"}