leetcode-13-最长公共前缀

24 阅读2分钟

最长公共前缀

思路

输入:strs = ["flower","flow","flight"]
输出:"fl"

由用例可知,每个字符串的长度可能不同,所以可以想到,最长公共前缀一定小于这些字符串中最短的那个,可用minL表示最短长度,即每个字符串只需要遍历到minL - 1即可。在该用例值minL为4,strsSize为3

所以为了判断某个字符是否“公共”,则需要按如下次序判断:

第一趟 第二趟 第三趟

flower flower flower

flow flow flow

flight flight flight

由上可知,第趟中三个字符串的第个字符都是f,第趟的第个字符都是l,第趟的第个字符出现了不同。

由上句加粗字体可得

第一趟判断的字符为,strs[0][0],strs[1][0],strs[2][0]

第二趟判断的字符为,strs[0][1],strs[1][1],strs[2][1] strs[行][列]

第二趟判断的字符为,strs[0][2],strs[1][2],strs[2][2]

我们一搬遍历都是先行后列,而这次需要先列后行。

因此需要控制列不变,行变。

列数即字符串的长度,则最长公共前缀都小于等于minL。因此可得如下代码。

代码

char * longestCommonPrefix(char ** strs, int strsSize){
    //用flag来控制前缀是否已找到,count用于表示前缀的数目,minL表示最短字符串
    int flag,count = 0,minL = 200;
    for(int i = 0; i < strsSize; i++)
    if(strlen(strs[i]) < minL)minL = strlen(strs[i]);
    for(int i = 0; i < minL; i++){
        flag = 1;
        for(int j = 0; j < strsSize - 1; j++){
            //当flag = 0则表明最长公共前缀已经找到
            if(strs[j][i] != strs[j + 1][i]){
                flag = 0;
                //两个break退出双重for循环
                break;
            }
        }
        //flag = 1则表明strs[i][count]为公共前缀之一
        if(flag)count++;
        else break;
    }
    //用'\0'来表示字符串的结束
    strs[0][count] = '\0';
    return strs[0];
}

大家若有其他方法,欢迎交流。