首页 > 试题广场 >

统计字符串中的重叠子串长度之和

[编程题]统计字符串中的重叠子串长度之和
  • 热度指数:147 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
找出字符串(全部都是小写的英文字母)中的重叠子串,计算各个字母对应的重叠子串的长度之和,并按照出现次数从大到小进行输出(注:若次数相同则ASCII值较小的字母先输出)。

例:
字符串 : aaabcccaddfffaa

其中字符a的重叠子串包括 aaa aa

其中字符c的重叠子串包括 ccc

其中字符d的重叠子串包括 dd

其中字符f的重叠子串包括 fff

那么,最终的输出结果就是:

a:5

c:3

f:3

d:2


输入描述:
一行字符串,其中可能包括若干个重叠子串,如:

aaabcccaddfffaa


输出描述:
重叠的字母为key,字母个数为value,中间用冒号连接,并按照长度之和从大到小输出,样例如下:

a:5

c:3

f:3

d:2
示例1

输入

aaabcccaddfffaa

输出

a:5
c:3
f:3
d:2
自定义节点保存各个单词出现的次数,便于后续自定义排序
import java.util.*;

public class Main {
    public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
        String input = scanner.next();
        statisticSubStr(input);
    }

    public static void statisticSubStr(String s){
        char arr[] = s.toCharArray();
        Node res[] = new Node[26];
        for(int i=0;i<26;i++){
            res[i] = new Node(0,(char)(i+'a'));
        }
        int sum = 1;
        boolean flag = false;
        for(int i=0;i<arr.length-1;i++){
            if(arr[i]==arr[i+1]){
                sum++;
                flag = true;
            }else if(flag){
                res[arr[i]-'a'].val+=sum;
                sum=1;
                flag = false;
            }
        }
        if(sum>1){
            res[arr[arr.length-1]-'a'].val+=sum;
        }
        Arrays.sort(res,new Comparator<Node>(){
            public int compare(Node n1,Node n2){
                if(n1.val==n2.val){
                    return n1.word-n2.word;
                }
                return n2.val-n1.val;
            }
        });
        for(int i=0;i<26;i++){
            if(res[i].val>0){
                String str = res[i].word + ":" + res[i].val;
                System.out.println(str);
            }
        }

    }

}
class Node{
    int val;
    char word;
    public Node(int val,char word){
        this.val = val;
        this.word = word;
    }
}


发表于 2024-09-03 16:24:31 回复(0)