/**
* 功能:查找两个字符串中的公共字符串。
*
* 思路: 1、判断两个字符串的长度,如果s1.length()<s2.length(),则交换值。
* 因为我们是在短的字符串中选取子字符串去匹配长的字符串,这样减少比较次数
* 2、使用substring()方法获取指定位置的子字符串。然后用indexOf()方法判断 的这个字符串是不是在s1中。
* 3、使用substring()方法获取子字符串时,先从最长的子字符串查找。
* 4、当存在相同长度的子字符串时,计数器加1,并且打印这些相同长度的字符串。
* 这里在内存循环结束时判断一次,如果计数器的值改变,则不在查找其他子字符串, 因为后面的产生的子字符串的长度都比这层小。并且返回当前计数器的值。
* 方法1:返回相同的最大字符串
*
* 方法2:返回所有相同的的字符串
*/
package test;
public class Demo2 {
public static void main(String[] args) {
String a = "abcdefghijklmnopqrstuvwxyz";
String b = "1234567890abcdfrgtddd12321414";
// 演示字符串有相同的情况
// String c = "123456789abc";
// String d = "a123abc";
// method_1(c,d);
System.out.println(a);
System.out.println(b);
System.out.println("相同的最大公共字符串的个数为:" + method_2(a, b));
}
/**
* method_1()方法 功能:判断两个字符串中是不是存在公共的字符串 如果有:打印当前相同的最大公共字符串,并且返回相同最大字符串的个数
* 如果没有:0
*
* 思路: 1、判断两个字符串的长度,如果s1.length()<s2.length(),则交换值。
* 因为我们是在短的字符串中选取子字符串去匹配长的字符串,这样减少比较次数
* 2、使用substring()方法获取指定位置的子字符串。然后用indexOf()方法判断 的这个字符串是不是在s1中。
* 3、使用substring()方法获取子字符串时,先从最长的子字符串查找。
* 4、当存在相同长度的子字符串时,计数器加1,并且打印这些相同长度的字符串。
* 这里在内存循环结束时判断一次,如果计数器的值改变,则不在查找其他子字符串, 因为后面的产生的子字符串的长度都比这层小。并且返回当前计数器的值。
*
*
* 注意: 1、此处默认公共字符串必须是有两个或者两个以上的字符串。 2、当存在多个相同位数的最大字符串时,全部打印出来
*
* @param s1
* @param s2
* @return
*/
public static int method_1(String s1, String s2) {
// 判断字符串的长度,若果字符串s1比s2短,就交换,必须保证s2是短的字符串
if (s1.length() < s2.length()) {
String temp = s1;
s1 = s2;
s2 = temp;
}
// 用于计算相同的最大公共字符串有多少个
int t = 0;
String str;
// 外层循环控制substring()方法的结尾,并且还控制偏移量的大小
for (int i = s2.length(); i > 1; i--) {
// 内存循环控制偏移量的递增
for (int j = 0; j <= s2.length() - i; j++) {
// 返回指定的部分字符串
str = s2.substring(j, i + j);
// 调用indexOf()方法,判断指定的字符串在s1字符串中是不是出现。
if (s1.indexOf(str) != -1) {
// 打印相同的字符串
System.out.println("最大的公共字符串为:" + str);
// 当存在相同的字符串时,计数器加一
t++;
}
}
// 接收内层循环时开始判断有没有出现过相同的字符串。如果有,返回相同字符串的个数
if (t != 0)
return t;
}
// 如果没有字相同字符串,执行这条语句
return t;
}
/**
* method_2()方法
*
* 功能:判断两个字符串中是不是存在公共的字符串 如果有:打印当前相同的公共字符串,并且返回相同字符串的个数 ,如果没有:返回0
*
* 思路: 1、判断两个字符串的长度,如果s1.length()<s2.length(),则交换值。
* 因为我们是在短的字符串中选取子字符串去匹配长的字符串,这样减少比较次数
* 2、使用substring()方法获取指定位置的子字符串。然后用indexOf()方法判断 的这个字符串是不是在s1中。
* 3、使用substring()方法获取子字符串时,先从最长的子字符串查找。
* 4、当存在相同长度的子字符串时,计数器加1,并且打印这些相同长度的字符串。
* 这里在内存循环结束时判断一次,并且返回当前计数器的值。
*
*
* 注意: 1、此处默认公共字符串必须是有两个或者两个以上的字符串。 2、当存在多个相同位数的字符串时,全部打印出来
*
* @param s1
* @param s2
* @return
*/
public static int method_2(String s1, String s2) {
// 判断字符串的长度,若果字符串s1比s2短,就交换,必须保证s2是短的字符串
if (s1.length() < s2.length()) {
String temp = s1;
s1 = s2;
s2 = temp;
}
// 用于计算相同的最大公共字符串有多少个
int t = 0;
String str;
// 外层循环控制substring()方法的结尾,并且还控制偏移量的大小
for (int i = s2.length(); i > 1; i--) {
// 内存循环控制偏移量的递增
for (int j = 0; j <= s2.length() - i; j++) {
// 返回指定的部分字符串
str = s2.substring(j, i + j);
// 调用indexOf()方法,判断指定的字符串在s1字符串中是不是出现。
if (s1.indexOf(str) != -1) {
// 打印相同的字符串
System.out.println("最大的公共字符串为:" + str);
// 当存在相同的字符串时,计数器加一
t++;
}
}
}
return t;
}
}