查找字符串中相同连续字符串最多的子串,如果有两串长度相同取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);
    }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值