String练习之找到最长字符串

最长公共字符串

  • 最长公共字符串

最长公共字符串

String编程练习,找到两个字符串最长的的公共部分(ps:只有一个)。
示例:

str1=“admintttion”;
str2=" adminsdatosdn";

结果:

admin;

我这里有3个方法,第一个方法很简单就是用暴力方式一个一个的截取,然后进行比较。

public static String kmmmp(String s1,String s2){
		String str="";
		String ss="";
		int a=0,b=0;
		//循环s1截取s1 逐个和s2比较
		for(int i=0;i<s1.length()-1;i++){
			for(int j=i+1;j<s1.length()-1;j++){
				str=s1.substring(i,j);
				
				boolean contains = s2.contains(str);
				
				if(contains==true){
					a=str.length();
					
					if(a>=b){
						b=a;
						ss=str;
					}
					
				}
				
			}
		}
		
		return ss;
		
	}

第二个方法也是很简单,和第一个差不多,不过是定义了一个数组,将比较出字符串都存在数组中,然后比较数组中这些字符串那个最长。

    private static String maxLString(String s1, String s2) {
		    // TODO Auto-generated method stub
			  //空字符串 表示返回的字符
			   String endS="";
			   //定义一个字符串数组
			   String[] str = new String[100];
			   //表示数
		    int count=0;
		    //循环第一串字符
		    for(int i=0;i<s1.length();i++) {
		    	 //空字符串 
		      String s="";
		           //再次循环第一串字符
		      for(int j=0;j<s1.length();j++) {
		    	  //比较
		        if(j>=i) {
		        	//s拼接一个字符
		          s+=s1.charAt(j);
		          //判断s2中是否拥有s这个字符
		          if(s2.indexOf(s)!=-1) {
		        	  //如果有,给字符数组赋值
		            str[count]=s;
		            count++;
		          }
		        }
		      }
		    }
		    //假设是第一个是最长的
		    endS=str[0];
		    //循环找到最长的
		    for(int i=0;i<count-1;i++) {
		      if(endS.length()<str[i+1].length()) {
		        endS=str[i+1];
		      }
		    }
		    return endS;
		  }

这个呢,嗯没啥好说的,自己看估计就能很容易的看明白。下面说的这个方法不是我想出来的。但感觉非常好。所以拿来用用:

public static String maxLengthString(String str1,String str2) {
	    int maxLength = 0;
	    String maxLengthString = "";
	    for (int i = 0; i < str1.length(); i++) {
	      for (int j = i+maxLength; j < str1.length(); j++) {
	        if (str2.indexOf(str1.substring(i, j)) != -1) {
	          if (j-i > maxLength) {
	            maxLength = j-i;
	            maxLengthString = str1.substring(i, j);
	          }
	        }
	      }
	    }
	    return maxLengthString;
	  }

为啥没加注释呢?我也不知道。

我来解释下代码吧
首先定义了一个长度maxLength 用来表示要截取的字符串的长度。
接下来定义最长的字符串 maxLengthString 、、嗯,这个看字母名字就能猜出来。

开始循环遍历第一个字符串。这里假设第一个字符串比第二个长。第二个循环就是核心了 j 是字符串的长度,进入循环体内。
先从i截取j个长度的str1的字符串。然后在str2中看看是否有这么个字符串,如果有的话就进入 if 语句。要是这个字符串的长度大于已经有的长度,那么久更改最大长度,并重新截取字符串。最后将最大的字符串进行返回。

通过我的描述很容易看出来,第二个的做法其实和第一个是一样的思想,都是循环第一个,然后截取比较,不同的地方就是在街区的时候不是一个,两个,三个这样的逐次的·截取,而是通过已知最长的字符串进行的截取。 这样说吧,比如现在已经知道最大的字符串长度是3,那么下次截取的时候我们就这个字符开始往下截取3个。

看完这个代码总感觉其实可以再简化,比如取出一个 aa 第二个里面没有,那么再取出aad的时候就不要再进行测试了。
所以在 if (str2.indexOf(str1.substring(i, j)) != -1) {}加上一个else{break; } 我觉的更好点。但是我没测试,不知道是否正确。

你可能感兴趣的:(String)