https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/40/
思路是很简单的,就是逐个比较。
但是我的想法是,先两两比较,然后把得到的前缀再和后面的比较,全部比较一遍以后就得到了最大前缀了。
int lcp(char *str1, char* str2, int size){ int new_size=0; while(*str1&&*str2&&size>new_size){ if(*str1==*str2){ str1++; str2++; new_size++; }else{ break; } } return new_size; } char* longestCommonPrefix(char** strs, int strsSize) { int i=0; char* s1,*s2; char* res; int size = strlen(strs[0]); s1 = strs[0]; for(i=1;i<strsSize;i++){ s2 = strs[i]; size = lcp(s1,s2,size); } if(size>0){ res = malloc(sizeof(char)*(size+1)); memcpy(res,strs[0],sizeof(char)*size); res[size]='\0'; }else res=""; return res; }
后来看了别人的,别人是所有数组同时比较同一个下标的字符的,感觉这样比较好,
会比我的方法减少一些不必要的执行次数。
如下:
char* longestCommonPrefix(char** strs, int strsSize) { char *p = *strs; int i = 0 ,j = 0; if (strsSize == 1) { return p; } if (p == NULL) { return ""; } while(p[j] != '\0') { for(int i = 1; i < strsSize; i++) { if(p[j] != strs[i][j]) { p[j] = '\0'; return p; } } j++; } return p; }