黑马程序员——求两个字符串最大公约数的解法

这篇博客探讨了如何找到两个字符串的最大公约数。举例来说,输入'ijsfajk'和'qhsfqal',算法应找出它们共有的字符'sf'作为最大公约数。博主首先分享了自己的解题思路,然后对比了学习资源中的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

题目:键盘输入两个字符串,获取这两个字符串的最大公约数并打印出来。例如:输入ijsfajk 和 qhsfqal ,输出的最大公约数是sf

      之前在看视频学习的过程中,遇到了这道练习题,在学习老师的解法之前,我先按照自己的思路写了一下,思路及代码如下:

/*
  思路:1.循环遍历两个字符串中的各个字符,判断相等的字符;
        2.如果两个字符相等,则判断该字符在对应字符串中位置之后的字符是否相等,
		  如果是,将相等的部分连接在一起组成新的字符串存储起来;
		3.再次回到循环,将新生成的子串同之前获取的子串的长度进行比较,选择较长的存储。
		4.循环完毕,将最终的子串返回,即为最大公约数。
*/
import java.lang.*;
import java.util.*;
public class MaxString1{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个字符串:");
		String arr1 = sc.nextLine();
		System.out.println("请输入第二个字符串:");
		String arr2 = sc.nextLine();
		String max = maxString(arr1,arr2);
		System.out.println("输入的两个字符串的最大公约数是:"+max);
	}
	public static String maxString(String a,String b){
		String temp = "";    //临时存储所获取的子串
		String tem = "";     //存储当前最大长度的子串
		//双重for循环遍历两个字符串中的各个字符
		for(int i = 0;i<a.length();i++){
			for(int j = 0;j<b.length();j++){
			int m = i; 
			int n = j;
			//判断第一个字符是否相等
			if(a.charAt(m)==b.charAt(n)){
				temp = a.charAt(m)+"";
				//第一个字符相等时,判断之后的字符是否相等
				while(++m<a.length() && ++n<b.length()){
				if(a.charAt(m)==b.charAt(n)){
					temp += a.charAt(m);
				}
				}
				//和之前获取的子串长度相比较,获取长度大的子串
				if(temp.length()>tem.length())
					tem = temp;

			}
		}
		}
		return tem;
	}
	
}

    以上便是我自己的思路及解法,经过半个多小时的调试,也可以运行出正确的结果。于是,我带着一种成就感继续看老师的解法,发现老师的思路跟我的完全不一样,不仅简便很多,就连代码实现上也简单了很多。主方法就不写了,只看功能实现的方法:

/*
	思路:1.比较两个字符串的长度;
	      2.将较短字符串按照长度递减的方式获取到;
	      3.判断获取到的字符串在较长字符串中是否存在,若存在,则是最大公约数。
*/
public static String maxString(String arr1,String arr2){
		String maxString;  //存储较大字符串
		String minString;  //存储较小字符串
		String temp = "";
		//比较两个字符串的长度
		if(arr1.length()>arr2.length()){
			maxString = arr1;
			minString = arr2;
		}else{
			maxString = arr2;
			minString = arr1;
		}
		//将较小字符串递减,并判断是否被较大字符串所包含
		for(int i = 0;i<minString.length();i++)
			for(int j=0,z=minString.length()-i;z!=minString.length()+1;j++,z++){
				temp = minString.substring(j,z);
				if(maxString.contains(temp))
					return temp;	
			}
		return "";
	}
}

       如果我一开始就按照视频的顺序从头看到尾,我只能学习到老师给的方法,绝对不会想到第一种方法。所以,我总结出了一种学习的方法,在掌握了基本的概念之后,在做练习题时,不妨自己先试着做一下,哪怕花的时间会多一些,都是值得的,因为每个人的思想不同,即使你的方法在实现上不如老师给的,但毕竟是自己研究出来的,在做题的过程中,既是对知识点的巩固与掌握,也是对应用知识解决问题能力的提升。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值