leetcode-14-最长公共前缀(longest common prefix)-java

题目及用例

package pid014;
/*最长公共前缀

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

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

示例 1:

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

示例 2:

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

说明:

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



*/


public class main {
	
	public static void main(String[] args) {
		String [][] testTable = {{"flower","flow","flight"},{"dog","racecar","car"}};
		for (String[] ito : testTable) {
			test(ito);
		}
	}
		 
	private static void test(String[] ito) {
		Solution solution = new Solution();
		String rtn;
		long begin = System.currentTimeMillis();
		for(int i=0;i<ito.length;i++){
			System.out.print(ito[i]+"  ");
		}
		System.out.println();
		//开始时打印数组
		
		rtn= solution.longestCommonPrefix(ito);//执行程序
		long end = System.currentTimeMillis();	
		
		System.out.println("rtn" );
		System.out.print(rtn);
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,9ms,很快)
具体方法是先算出所有字符串的最小长度,在最小长度内循环
每次取第一个字符串的对应字符作基准,如果后面的与他相同,则小循环后结果加入这个,否则直接返回结果

package pid014;

import java.util.Arrays;

public class Solution {
public String longestCommonPrefix(String[] strs) {
    int num=strs.length;//num为总共几个字符串
    if(num==0){
    	return "";
    }
    if(num==1){
    	return strs[0];
    }
    int min=strs[0].length();
	for(int i=1;i<num;i++){
		if(strs[i].length()<min){
			min=strs[i].length();
		}
	}//得到最小的长度
	StringBuilder a=new StringBuilder();
	for(int i=0;i<min;i++){
		char now=strs[0].charAt(i);
		for(int j=1;j<num;j++){
			if(strs[j].charAt(i)!=now){
				return a.toString();
			}
		}
		a.append(now);
	}
	return a.toString();
    }
	

}

解法2(成功,3ms,较快)
与上面方法差不多,就是将记录一个stringbuilder变成只记录最后一个对应的字符的index,返回时直接substring即可

	public String longestCommonPrefix(String[] strs) {
		int size=strs.length;
		if(size==0){
			return "";
		}
		if(size==1){
			return strs[0];
		}
		//这个为所有字符串中最短的length
		int minLength=strs[0].length();
		for(int i=1;i<size;i++){
			if(minLength>strs[i].length()){
				minLength=strs[i].length();
			}
		}
		int index=0;
		for(int i=0;i<minLength;i++){
			char now=strs[0].charAt(i);
			for(int j=1;j<size;j++){
				if(now!=strs[j].charAt(i)){
					return strs[0].substring(0, index);
				}
			}
			index++;
		}		
		return strs[0].substring(0, index);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值