最长公共前缀

该博客介绍了两种方法来找到字符串数组的最长公共前缀。方法一是扫描法,遍历第一个字符串并检查所有字符串的对应位置是否相同;方法二是分治法,将问题拆分为两半分别求解然后合并结果。这两种方法的时间复杂度都是线性的,但分治法可能在空间上更为高效。
摘要由CSDN通过智能技术生成

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

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

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

方法一:扫描法

char * longestCommonPrefix(char ** strs, int strsSize)
{
    if(strsSize == 0)                           
        return "";

    for(int i=0; i < strlen(strs[0]); i++)
    {    
        for(int j=0; j < strsSize; j++)
        {
            if(strs[j][i] != strs[0][i])
            {       
                strs[0][i] = '\0';              
                return strs[0];                
            }
        }
    }

    return strs[0];                           
}

  • 时间复杂度:O(mn),m和n分别为字符串平均长度和字符串个数。
  • 空间复杂度:O(1)。

方法二:分治法

(copy C++解法,c还未实现)

//(但如果是c这样字符数组分治法的分在这里是不是没必要了?)

    public String longestCommonPrefix(String[] strs) {
		if ( strs.length==0 || strs==null ) {
			return "";
		}
		return divide(strs, 0, strs.length-1);
 
    }
	public String divide(String[] s, int left, int right) {
		if ( left==right) return s[left];
		int mid = (left+right)/2;
		String s1 = divide(s, left, mid);
		String s2 = divide(s, mid+1, right);
		return Prefix(s1, s2);
		
	}
	public String Prefix(String s1, String s2) {
		int length = Math.min(s1.length(), s2.length());
		int index=0;
		for ( int i=0; i<length; i++ ) {
			if ( s1.charAt(i)!= s2.charAt(i) ) {
				break;
			}
			index++;
		}
		return s1.substring(0, index);
	}
    
}
char * longestCommonPrefix(char ** strs, int strsSize)
{
    int mid=strsSize/2;
    char *s1=longestCommonPrefix(strs,0,mid);
    char *s2=longestCommonPrefix(strs,mid+1,strs-1);

    //int len=Math.min(s1.length,s2.length);
    ...
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值