给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
数据范围:
,
进阶:空间复杂度
,时间复杂度
char* longestCommonPrefix(char** strs, int strsLen ) { if (strsLen == 0) return ""; //字符串为空,返回空 for (int col=0; strs[0][col]!='\0'; ++col) { //逐行比较 for (int row=1; row<strsLen; ++row) //row=1不能省略 { if (strs[0][col] != strs[row][col]) { strs[0][col] = '\0'; //截断一样的部分 return strs[0]; //部分一样 } } } return strs[0]; //完全一样 }
char* longestCommonPrefix(char** strs, int strsLen ) { int str_lengthmin_LOC, str_lengthmin, i,j; char* str; if(strsLen==0) return ""; else if(strsLen==1) return strs[0]; str_lengthmin_LOC=0; for(i=0; i<strsLen; i++) { if(strlen(strs[i]) < strlen(strs[str_lengthmin_LOC])) str_lengthmin_LOC = i; } str = (char*)malloc(strlen(strs[str_lengthmin_LOC])+1); str_lengthmin = strlen(strs[str_lengthmin_LOC]); //printf("strsLen:%d str_lengthmin_LOC:%d\n", strsLen, str_lengthmin_LOC); for(i=str_lengthmin; i>0; i--) { for(j=0; j<strsLen; j++) { //printf("i:%d j:%d str:%s %s\n", i,j,strs[j],strs[str_lengthmin_LOC]); if(strncmp(strs[j], strs[str_lengthmin_LOC], i)) break; } if(j==strsLen){ strncpy(str,strs[str_lengthmin_LOC],i); str[i] = 0; //printf("over, i:%d j:%d str:%s\n", i,j,str); return str; } } return ""; }
char* longestCommonPrefix(char** strs, int strsLen ) { // write code here //如果字符串为空,返回空 if (strsLen == 0) { return ""; } //求第一个字符串的长度 int len = strlen(strs[0]); //与第一个字符串的每个字符做对比,以此为基准 for (int i = 0; i < len; i++) { char c = strs[0][i]; //将其他段的字符对应位置的字符进行比较 for (int j = 1; j < strsLen; j++) { //如果对应位置字符不相同 //说明在这之前的都是相同的前缀字符 if (strs[j][i] != c) { //截断前缀 strs[0][i] = '\0'; //返回前缀 return strs[0]; } } } //所以字符串都相同 return strs[0]; }
挨个对比前缀字符即可
char* longestCommonPrefix(char** strs, int strsLen ) { // write code here if(strsLen == 0) return ""; if(strlen(strs[0])==0) return ""; int min = strlen(strs[0]); for(int i=0; i<strsLen; i++){ if(min>strlen(strs[i])) min=strlen(strs[i]); } char* ret = (char*)malloc(sizeof(char)*(min+1)); if(ret==NULL) return NULL; int num=0; for(int j=0; j<min;j++) { int flag=0; for(int i=1; i<strsLen; i++) { if(strs[i][j]!=strs[i-1][j]) { flag=1; break; } } if(flag==0) ret[num++]=strs[0][j]; else break; } ret[num]='\0'; return ret; }
static char* min(char** strs, int strsLen){ char *ps[strsLen],*tp; int N = strsLen; for(int i = 0;i < strsLen;i++) ps[i] = strs[i]; int min = strlen(ps[0]); tp = ps[0]; for(int i = 0;i < strsLen;i++){ if(strlen(ps[i]) < min){ min = strlen(ps[i]); tp = ps[i]; } } return tp; } char* longestCommonPrefix(char** strs, int strsLen ) { if(!strsLen)return ""; char* s; s = min(strs,strsLen); int m = strlen(s); for(int i = 0; i < strsLen; i++){ for(int j = 0; j < m; j++){ if(s[j] != strs[i][j]) m = j; } } char* ss = (char*)malloc(m*sizeof(char)); for(int i = 0; i < m ; i++ ) ss[i] = s[i]; ss[m] = '\0'; return ss; }