受18楼启发。完善后的代码如下
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
/*
* 思路:
* A:将小串转换成char数组
* B:使用String构造方法构造子串(公约数)(可以使用长度参数来构造子字符串)
* C:在大串中查找子串的索引
* D:不存在,索引返回-1,存在返回真实索引
* E:将子串去重复、按长度从大到小存储在TreeSet集合中
* F:将子串的长度存储在ArrayList集合中,之后对集合进行去重复和排序
* G:获取ArrayList集合最大索引处的值,即为最大公约数的长度,按长度在TreeSet集合中找出最大公约数
* 最大公约数:opfhapio 和 opfhapii
*/
public class FuxiDemo {
public static void main(String[] args) {
String maxStr = "dhfsdhifaospdifahfsdiopfhapioddhfsdhifaospdifahfsdiopfhapiid";
String minStr = "sdhfopfhapioassdhfopfhapiias";
method(maxStr, minStr);
}
private static void method(String s1, String s2) {
String maxS;
String minS;
if (s1.length() > s2.length()) {
maxS = s1;
minS = s2;
} else {
maxS = s2;
minS = s1;
}
// 这个集合用来存储所有公约数
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {
public int compare(String s1, String s2) {
int num = s2.length() - s1.length();
int num2 = num == 0 ? s2.compareTo(s1) : num;
return num2;
}
});
// 这个集合用来存储公约数的长度
List<Integer> array = new ArrayList<Integer>();
char[] chs = minS.toCharArray();
// 第一个for循环用于控制截取的子字符串长度
for (int x = chs.length - 1; x > 0; x--) {
// 用于控制截取的字符串
for (int y = 0; y + x < chs.length; y++) {
String temp = new String(chs, y, x);
// 子串与大串比较,返回索引,判断索引是否为-1,不为-1则存在
int index = maxS.indexOf(temp);
if (index != -1) {
ts.add(temp);
array.add(temp.length());
continue;
}
}
}
// 对公约数的长度去重复、排序。最后索引位置的值即为最大公约数的长度
for (int x = 0; x < array.size() - 1; x++) {
for (int y = x + 1; y < array.size(); y++) {
if (array.get(x) == array.get(y)) {
array.remove(y);
y--;
}
}
}
Collections.sort(array);
System.out.println("公约数有:");
for (String s : ts) {
System.out.println(s);
}
System.out.println("-------------------");
System.out.println("公约数的长度有:");
for (Integer i : array) {
System.out.println(i);
}
System.out.println("-------------------");
System.out.println("最大公约数有:");
for (String s : ts) {
if (s.length() == array.get(array.size() - 1)) {
System.out.println(s);
} else if (s.length() < array.get(array.size() - 1)) {
break;
}
}
}
}
|