LeetCode二分法汇总-2

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

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

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

所有输入只包含小写字母 a-z 。

首先选择数组里最小的一个,他可能是公共前缀的最大长度。然后以这个数来进行二分法,当公共值等于mid的时候,有可能相等或者大于;当小于的时候,就mid-1继续判断

class Solution140002{
	public String longestCommonPrefix(String[] strs){
		if (strs.length == 0 || strs == null){
			return "";
		}

		int minLength = Integer.MAX_VALUE;
		for (String str : strs) {
			minLength = Math.min(minLength , str.length());
		}

		int low = 0,high = minLength;
		while (low < high){
			int mid = low + (high - low + 1) / 2;// 防溢出
			if (isCommonPrefix(strs,mid)){
				low = mid;//注意是while循环 如果公共值大于mid 则一直判断
			}else {
				low = mid - 1;
			}
		}
		return strs[0].substring(0,low);
	}

	private boolean isCommonPrefix(String[] strs, int length) {
		String str0 = strs[0].substring(0, length);
		int count = strs.length;
		for (int i = 1; i < count; i++) {
			String str = strs[i];
			for (int j = 0; j < length; j++) {
				if (str0.charAt(j) != str.charAt(j)){
					return false;
				}
			}
		}
		return true;
	}
}

时间复杂度:O(mn log m) 其中m是字符串的最小长度,n是字符串的数量。二分查找的迭代次数是O(log m) 每次迭代最多需要比较mn个字符。

空间复杂度: O(1) 使用的额外空间复杂度为常数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值