论坛有很多类似帖,最好先搜索一下
这种方法缺点是只从左到右比较, 取得第一次遇到的最大相同字符串
- public class test {
- public static void main(String[] args) {
-
- System.out.println(getMaxSubString(s1,s2));
- }
- public static String getMaxSubString(String s1, String s2) {
- String max, min;
- max = s1.length() > s2.length() ? s1 : s2;
- min = s1.length() <= s2.length() ? s1 : s2;//这个min 跟max 是为了判断获取的2个字符串 把长的赋值给max短的赋值给min 减少比较次数
- for(int x=0; x<min.length(); x++){
- for(int y=0,z=min.length()-x; z<=min.length(); y++,z++){//先比较整个的min字符 也就是0角标到min.length()角标
- String temp = min.substring(y,z); //第二次是min.length-1个字符来比较 也就是werabcdty erabcdtyu
- if(max.contains(temp)){ //第三次是min.length-2个字符来比较 也就是werabcdt erabcdty rabcdtyu 以此类推的...
- return temp;
- }
- }
- }
- return null;
- }
- }
复制代码 下面这段代码提供了,可计最大相同子串出现次数,同样也有如有两个不同子串长度最大且相等的时候,输出结果取决于entrySet()取出的映射- import java.util.HashMap;
- import java.util.Map;
- public class test {
- public static void main(String[] args) {
- Map<String, Integer> map = new HashMap<String, Integer>();
- String s1 = "cdefsadabcdfghjcdefkl";
- String s2 = "cdefghjwerabcdtyucdef";
- for (int i = 0; i < s2.length(); i++) {
- for (int j = i + 1; j <= s2.length(); j++) {
- String key = s2.substring(i, j);
- if (s1.contains(key)) {
- if (map.containsKey(key)) {
- map.put(key, map.get(key) + 1);
- } else {
- map.put(key, 1);
- }
- }
- }
- }
- int maxValue = 0;
- String maxKey = "";
- for (Map.Entry<String, Integer> m : map.entrySet()) {
- if (m.getKey().length()> maxKey.length()) {
- maxValue = m.getValue();
- maxKey = m.getKey();
- }
- }
- System.out.println("最大的重复子串为:"+maxKey+" 出现次数为:"+maxValue);
- }
- }
复制代码 |