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

原文地址:https://www.cnblogs.com/LiLiliang/p/11686852.html

时间: 2024-10-06 18:30:29

查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33的相关文章

字符串中连续出现最多的子串 &amp; 字符串中最长重复子串

字符串中连续出现最多的子串 & 字符串中最长重复子串 字符串中连续出现最多的子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的对应位置,如下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ......

字符串中连续出现最多的子串 &amp;amp; 字符串中最长反复子串

字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的相应位置,例如以下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ....

求一个字符串中连续出现最多的子串次数

时间:2014.09.12 地点:基地 心情:明天就要和欧阳去武汉面试阿里了,整理一下同学求助的一道题,写下这一篇,愿一切顺利. 一.题目: 求一个字符串中连续出现最多的子串次数:例如字符串abcbcbcabc,连续出现次数最多的子串是bc,出现次数为3. 二.分析 方法:后缀思路 比如题目中举例中的字符串,它的后缀有: abcbcbcabc  0 bcbcbcabc  1 cbcbcabc  2 bcbcabc  3 cbcabc  4 bcabc  5 cabc  6 abc  7 bc  

LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。

ZigZag Conversion The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line

Light oj 1138 - Trailing Zeroes (III) 【二分查找 &amp;&amp; N!中末尾连续0的个数】

1138 - Trailing Zeroes (III) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. F

一个字符串中连续出现次数最多的子串【转】一个字符串中连续出现次数最多的子串【转】

问题描述: 求一个字符串中连续出现次数最多的子串,子串的长度可以是 1 . 分析问题: 乍一看,好像无处下手.简单的穷举效率太低,随着输入的文本增长,时间复杂度和空间复杂度就会火箭般窜升至无法接受的地步. 我们需要寻找规律. 假设存在一个长度为 N 的子串 S 出现的次数最多.那么它具有哪些特点呢? S 的任一子串的出现次数不少于 S 的出现次数 S 中不会出现重复的子串字符 S 中不会出现重复的字符 组成 S 的每一个字符.每一个子串的出现次数都和 S 一样 “S 中不会出现重复的字符”,“组

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

求一个字符串中连续出现的次数最多的子串

求一个字符串中连续出现的次数最多的子串.例如字符串“abababc”,最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次

求一个字串中最长的连续字符串

举例子来说:对于字符串"1234abcdef1234567abcdefghijklmn",这个字串中最长的连续字符串为"abcdefghijklmn". int continumax(char *outputstr,char *inputstr) { char maxrecord[100] = {0}; int maxlength = 0; char currentrecord[100] = {0}; int currentlength = 0; char valu