最长公共前缀---2022/01/18

题目描述
最长公共前缀

思路:
寻找字符串数组里最小长度的字符串,然后用暴力法循环找出所有子串,并在其他的字符串中进行比对,并更新最长的公共前缀。
收获:
1、关掉其中一个代码编辑的窗口,使用快捷键ctrl+shift+{
2、在windows中的debug目录下打开观察变量窗口
3、关于寻找字符串中的子字符串,我这里的方法是遍历组合的方式,不知道有何更快捷的方法?
4、输入单个字符串“a”的时候出现错误,这是因为res根本没有被第一个字符赋值的机会
5、输入{"a","ab"}的时候,此时无输出,这个原因是因为最短子串无法进入循环导致的
6、输入["reflower","flow","flight"]时有输出fl,此时的原因是对题目理解不清,
题目说的是公共前缀,而不需要所有子串,所有,只需要一重循环而不需要多重;
这里还有一个问题,就是contain表示只包含,并不能定位子串是否属于前缀的位置
这里的解决思路是:应该考虑取最小长度的字符串,然后从第一位开始逐位比较,遇到
不同的值直接返回。

以下为java代码实现:

 public  String longestCommonPrefix(String[] strs) {
		 String res="";
		 
		 if(strs.length==1)
			{
				return strs[0];
			}
			String temp=strs[0];
			int tag=0;
			//寻找最短的字符串
		for(int i=0;i<strs.length;i++)
		{
			if(strs[i].length()==0)
			{
				return res;
			}
			if(temp.length()>strs[i].length())
			{
				temp=strs[i];
				tag=i;
			}
		}
		

		char [] ch_te=temp.toCharArray();
		for(int i=0;i<temp.length();i++)
		{
			
			for(int j=0;j<strs.length;j++)
			{
				if(j==tag)
				{
					continue;
				}
				char [] ch_te1=strs[j].toCharArray();
				if(ch_te1[i]!=ch_te[i])
				{
					return res;
				}
			}
			res=res+String.valueOf(ch_te[i]);
				
		}
		
		return res;

		 
	 }

以下为评估结果。
在这里插入图片描述
实在是惨不忍睹,果然是脑子久了不用就会生锈。明明是简单题,却花了我两个多小时的时间,说明了,需要仔细审题,并且勤加练习。
希望多多积累经验吧。不要辜负时光,不要忽略点滴的积累。

2022/01/19更
以下为代码实现

/*
 * 
         作者:城主
         日期 :2022.01.19 
	 题目:
	 编写一个函数来查找字符串数组中的最长公共前缀。
	如果不存在公共前缀,返回空字符串 ""。
	
	优化。
	为了节省空间,决定从第一位的字符串开始取。
	为了提高速度,直接做子串定位的方式。
	收获:
	如果搜索的子串长度大于字符串,会直接返回-1。
	
 */

public class huiwen_0109 {

	public static void main(String[] args) {
		String [] strs= {"flower","flower","flower","flower"};
		String str = "flower";
		System.out.println(longestCommonPrefix(strs));

	}
	
	 public static String longestCommonPrefix(String[] strs) {
		 String res="";
		 
		if(strs.length==1)
		{
			return strs[0];
		}
		for(int i=0;i<strs.length;i++)
		{
			if(strs[i].length()==0)
			{
				return res;
			}
		}
		
		char [] ch_te=strs[0].toCharArray();
		String temp="";
		
		for(int i=0;i<strs[0].length();i++)
		{
			temp=temp+String.valueOf(ch_te[i]);
			for(int j=1;j<strs.length;j++)
			{
				if(strs[j].indexOf(temp)!=0||strs[j].indexOf(temp)==-1)
				{
					return res;
				}
			}
			res=res+String.valueOf(ch_te[i]);	
		}
		
		return res;

	 }
}

内存性能有所提升,但是时间性能并无大的改观。
在这里插入图片描述
采用了字典序的方法,并考虑了长度。大概思路是先对字符串数组进行字典序排列。那么工作就变成了取前后两个字符串的的公共前缀。这里还考虑了长度问题,用tag来区分哪个作为比较的基准,然后进行比较。
比较的原则是,取较短字符串的最长子串开始(首位不变),依次递减长度与较长字符串进行匹配,如果匹配到直接输出,否则继续。
以下为java实现。

public static String longestCommonPrefix(String[] strs) {
		String res="";
		Arrays.sort(strs);
		if(strs.length==1)
		{
			return strs[0];
		}

		//取字符串最短的那个
		int tag=strs.length-1;
		if(strs[0].length()<strs[strs.length-1].length())
		{
			tag=0;
		}
		if(strs[tag].length()==0) return "";
		
	    String te_s="";
	    
		for(int i=strs[tag].length()-1;i>=0;i--)
		{
			te_s=strs[tag].substring(0,i+1);
			if(strs[strs.length-1-tag].substring(0,i+1).equals(te_s))
			{
				return te_s;
			}
		}	
		return res;
	 }

以下为性能评估。
在这里插入图片描述
思路大概是这样子,但是对于代码的写法仍有待优化,提升性能。
2022/01/19更。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值