查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33
Posted lililiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33相关的知识,希望对你有一定的参考价值。
package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; // 查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33 /* 思路:新建一个map和字符数组,map中key为字符,value为连续字符个数;当第一次出现字符时,将字符存入map,value值为1,
如果map中已存在key,判断其值是否与前一个字符连续,如果连续,value加一,如果不连续,判断与后面字符是否连续,
判断连续个数,将连续个数存到map的value中,并将比较位置转移到最后一个连续位置,再次比较下一个字符在map是否存在
直至遍历完成。遍历完成后数组将会存储到所有不同的字符,将数组排序,通过有序数组遍历,找出map中value最大的数,
对有序序列遍历,保证找到的最大有序序列是ASCII码是是value中最小的。 */ public class Main { @SuppressWarnings("resource") public static void main(String[] args) { // 输入字符串,赋值到str中 Scanner sc = new Scanner(System.in); String str = sc.next(); Map<String, Integer> map = new HashMap<String, Integer>(); List<String> l = new ArrayList<String>(); for (int i = 0; i < str.length(); i++) { // 该字符已出现过 if (map.containsKey(str.charAt(i) + "")) { // 是连续出现的 if (i > 0 && str.charAt(i) == str.charAt(i - 1)) { map.put(str.charAt(i) + "", map.get(str.charAt(i) + "") + 1); } else { // 非连续出现的 int tmp = 0; // 查找后面是否连续 for (int j = i; j < str.length(); j++) { if (str.charAt(j) == str.charAt(i)) { tmp++; } else { break; } } // 判断后面连续个数和map中存储的个数是否相同 if (map.get(str.charAt(i) + "") < tmp) { map.put(str.charAt(i) + "", tmp); } // 将i赋值到最后一个连续的位置 i += tmp - 1; } } else { // 该字符第一次出现 l.add(str.charAt(i) + ""); map.put(str.charAt(i) + "", 1); } } // l排个序 l=bubble(l); // quickSort(l, 0, l.size() - 1); // 查找有序序列中连续个数最多的字符 int max = 0; String maxStr = ""; for (int i = 0; i < l.size(); i++) { String s = l.get(i); if (max < map.get(s)) { max = map.get(s); maxStr = s; } } // 将子串长度最长的打印出来 String result = ""; for (int i = 0; i < max; i++) { result += maxStr; } System.out.println(result); } //冒泡排序 public static List<String> bubble(List<String> l) { for (int i = 0; i < l.size(); i++) { for (int j = i; j < l.size(); j++) { if (l.get(i).charAt(0) > l.get(j).charAt(0)) { String k = l.get(i); l.set(i, l.get(j)); l.set(j, k); } } } return l; } //快排 public static void quickSort(List<String> l, int start, int end) { int i = start, j = end; char tmp; if (start < end) { tmp = l.get(start).charAt(0); while (i != j) { while (j > i && l.get(j).charAt(0) >= tmp) { j--; } l.set(i, l.get(j)); while (i < j && l.get(i).charAt(0) <= tmp) { i++; } l.set(j, l.get(i)); } l.set(i, tmp + ""); quickSort(l, start, i - 1); quickSort(l, i + 1, end); } } }
以上是关于查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33的主要内容,如果未能解决你的问题,请参考以下文章
字符串中连续出现最多的子串 & 字符串中最长反复子串