力扣14. 最长公共前缀

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0) return "";//不用加括号吗
        String prefix = strs[0];
        for(int i=1; i<strs.length; i++){
            prefix = longestCommonPrefix(prefix, strs[i]);
            if(prefix.length() == 0){
                return "";
            }
        }
        return prefix;
    }

    public String longestCommonPrefix(String str1, String str2){//方法名可以相同,方法重载
        int len = Math.min(str1.length(), str2.length());
        int commonlength = 0;
        for(int i=0; i<len; i++){
            if(str1.charAt(i) == str2.charAt(i)){
                commonlength++;
            }
            else break;//没有共同前缀退出循环
        }
        return str1.substring(0, commonlength);
    }
}

归纳:
先比较两个字符串的最大前缀,然后用最大前缀和后面的字符串比较
String[ ] 调用.length不用加()

力扣平台上,使用C语言解决最长公共前缀问题有多种实现方式,以下是几种常见的代码示例: ### 解法一 ```c char* longestCommonPrefix(char** strs, int strsSize) { // 如果没有字符串,返回NULL if (strsSize == 0) { return ""; } // 假设第一个字符串是最长公共前缀的初始值 char* prefix = (char*)malloc(strlen(strs[0]) + 1); if (!prefix) { // 如果内存分配失败,返回NULL return ""; } strcpy(prefix, strs[0]);//复制 //初始值与其他字符串各个位置的字符相比 for (int j = 1; j < strsSize; ++j) { // 初始化最长公共前缀的开始位置 int k = 0; while (k < strlen(prefix) && prefix[k] == strs[j][k]) {//判断条件:长度大于0并且其他位置的字符与初始值相同位置上的字符相同 ++k; // 移动到下一个字符 } // 截断prefix到匹配的长度 prefix[k] = '\0';//结束字符--strlen检测'\0'结束计算长度 } // 检查是否所有字符串都为空,如果是,则没有公共前缀 if (strlen(prefix) == 0) { free(prefix); return ""; } char* result = strdup(prefix); // 创建公共前缀的副本作为返回值 free(prefix); // 释放prefix,因为它只是临时使用 return result; // 返回公共前缀 } ``` 此解法先假设第一个字符串为最长公共前缀,然后与其他字符串逐一比较,不断更新公共前缀的长度,最后返回结果。代码来源参考[^2]。 ### 解法二 ```c char * longestCommonPrefix(char ** strs, int strsSize){ if(strsSize==0){ return ""; } for(int i=0;i<strlen(strs[0]);i++){ for(int j=1;j<strsSize;j++){ if(strs[0][i]!=strs[j][i]){ strs[0][i]='\0'; return strs[0]; } } } return strs[0]; } ``` 该解法通过遍历第一个字符串的每个字符,与其他字符串对应位置的字符进行比较,若发现不同则截断第一个字符串并返回。代码来源参考[^3]。 ### 解法三 ```c char * longestCommonPrefix(char ** strs, int strsSize){ char cmp; int flag = 0; int i; if(strsSize == 0) //判断是否为空字符串 return ""; for (i = 0; flag == 0 && strs[0][i] != '\0' ;i++){ //依次取第一个字符串的字母,flag 是循环退出标识,当有字符串的字符不相同时会置为1,当取到字符串结尾符时也要退出循环。 cmp = strs[0][i]; //取出一个字母 for (int j = 1;j<strsSize;j++){ //循环各个其他字符串 if (strs[j][i] != cmp){ //进行比较,不同时退出 flag = 1; //将标识置1来退出外面的大循环 i--; //这里需要注意的是后面break退出这个循环后会执行大循环里的 i++ ,但此时不应该让他加,所以在这提前减1 break; } } } char* result; result = (char*)malloc(sizeof(char) * (i+1)); memcpy(result, strs[0], i); //拷贝前缀 result[i] = '\0'; //加上结尾标识 return result; } ``` 此解法依次取出第一个字符串的字母,与其他字符串相应位置的字母比较,若不同则跳出循环,最后返回相同的前缀字符串。代码来源参考[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值