LeetCode初级算法20:最长公共前缀

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

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

示例 1:

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

示例 2:

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

提示:

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

🐖思路一:

以字符串数组的 第一个元素作为 前缀
遍历 字符串数组 如果 当前前缀不成立 缩短一个字符 周而复始

上代码
public static String longestCommonPrefix(String[] strs) {
    		if(strs.length == 0) {
    			return "";
    		}
    		//以字符串数组的第一个元素作为 公共前缀
    		String prefix = strs[0];
    		//遍历之后的字符串
    		for(int i = 1 ; i < strs.length ; i++) {
    			//如果有字符串长度为0  可直接返回 ""
    			if(strs[i].length() == 0) {
    				return "";
    			}
    			//当有字符串 不以 此 前缀 作为 前缀的话 前缀要缩短一位
    			while(!strs[i].startsWith(prefix)) {
    				prefix = prefix.substring(0, prefix.length()-1);
    			}
    		}
    		//最后返回 prefix 有可能是 空字符串 也可能是正确的最长公共前缀
    		return prefix;
    }

在这里插入图片描述

🐒思路二:

先找到字符串数组 中 长度最短的那个字符串 并记录他的长度
接下来用长度最短的 字符串 去匹配每个字符串 如果不匹配则长度 -1 继续周而复始 直到 最短长度为0 或 成功退出

上代码
public static String longestCommonPrefix_V2(String[] strs) {
    	if(strs.length == 0) {
    		return "";
    	}
    	int minLen = Integer.MAX_VALUE;
    	String  minStr = "";
    	//一次循环 找到 最短长度的字符串 并记录最短长度
    	for(String str : strs) {
    		if(str.length() < minLen) {
    			minLen = str.length();
    			minStr = str;
    		}
    	}
    	//用最短长度的字符串 匹配其他字符串 如果不匹配则 长度 -1 周而复始
    	for(String str : strs) {
    		//有几个 字符串 就遍历几次循环 
    		//一次while下来要不就是找到和第一个str 有公共前缀的minStr 要不就break 匹配下一个字符串
    		while(minLen > 0) {
    			//如果当前str 不以 此 minStr作为前缀 minLen 减一 并缩短一位
    			if(!str.startsWith(minStr)) {
    				minLen --;
    				minStr = minStr.substring(0, minLen);
    			}else{	// 否则可以直接退出
    				break;
    			}
    		}
    	}
    	//最后返回 最短字符串 截取 0 到 minLen 有效范围的子字符串即可
    	return minStr.substring(0,minLen);
    }

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值