本周的算法題難度級別依舊是'Easy',也很簡單
題目:找出所有字符串中最長的公共前綴
思路:提供兩個(gè)思路祭阀,一個(gè)思路是兩個(gè)兩個(gè)字符串進(jìn)行比較谱轨,取出公共的前綴位數(shù)再和下一個(gè)字符串比較磺芭。另一個(gè)思路就是把第一個(gè)字符串的每一個(gè)字母分別和剩下所有的字符串的每一個(gè)字母比較
代碼:
//思路一:
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize == 0) return "";
if (strsSize == 1) return *strs;
//取第一個(gè)字符串的長度
int len = strlen(strs[0]);
for (int i = 0;i < strsSize - 1;i++) {
//取當(dāng)前的字符串和下一個(gè)字符串長度短的長度
int tempLen = strlen(strs[i]) < strlen(strs[i+1]) ? strlen(strs[i]) : strlen(strs[i+1]);
for (int j = 0;j < tempLen && j < len;j++) {
//比較當(dāng)前字符串和下一個(gè)字符串的元素是否一樣,如果不一樣斟湃,記錄數(shù)字
if (strs[i][j] != strs[i+1][j]) {
len = j;
break;
}
}
//取短的長度
len = len < tempLen ? len : tempLen;
}
if (len == 0) return "";
char *result = malloc(len+1);
//記錄第一個(gè)字符串公共的部分
for (int i = 0;i < len; i++)
result[i] = strs[0][i];
result[len] = '\0';
return result;
}
//思路2
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize == 0) return "";
if (strsSize == 1) return *strs;
//stop:是否停止循環(huán) len:公共長度
int stop = 0,len = 0;
for (;len < strlen(*strs); len++ ) {
for (int i = 1;i < strsSize;i++) {
//比較所有字符串的共同位置联予,如果不相同或者長于某一個(gè)字符串的長度則停止循環(huán) 返回字符串
if (strs[0][len] != strs[i][len] || len > strlen(strs[i])) {
stop = 1;
break;
}
}
if (stop) break;
}
if (len == 0) return "";
char *result = malloc(len+1);
for (int i = 0;i < len; i++)
result[i] = strs[0][i];
result[len] = '\0';
return result;
}
這題的思路很簡單,但實(shí)現(xiàn)起來確會出現(xiàn)很多問題率翅,比如內(nèi)存之類的练俐,C語言真不好用。冕臭。腺晾。