Java练习题-输入一个字符串,如何求最大重复出现的字符串?

比如输入 ttabcftrgabcd,输出结果为 abc, canffcancd,输出结果为 can。

下面是解题代码:

import java.util.HashMap;
import java.util.Map;

/**
 * 输入一个字符串,如何求最长的重复出现的字符串?<br>
 * 比如输入 ttabcftrgabcd,输出结果为 abc, canffcancd,输出结果为 can。
 * 
 * @author Tang
 */
public class Test {

    public static void main(String[] args) {
        System.out.println("ttabcftrgabcd中最长的重复字符串:" + computeMaxRepeatString("ttabcftrgabcd"));
        System.out.println("canffcancd中最长的重复字符串:" + computeMaxRepeatString("canffcancd"));
        System.out.println();
        System.out.println("A中最长的重复字符串:" + computeMaxRepeatString("A"));
        System.out.println("AB中最长的重复字符串:" + computeMaxRepeatString("AB"));
        System.out.println();
        System.out.println("ABCDBCD中最长的重复字符串:" + computeMaxRepeatString("ABCDBCD"));
        System.out.println("ABCDBCDCD中最长的重复字符串:" + computeMaxRepeatString("ABCDBCDCD"));
        System.out.println();
        System.out.println("ABCDABCDCD中最长的重复字符串:" + computeMaxRepeatString("ABCDABCDCD"));
        System.out.println("ABCDABCDBCDCD中最长的重复字符串:" + computeMaxRepeatString("ABCDABCDBCDCD"));
    }

    /**
     * 计算最长的重复字符串
     * 
     * @param str
     * @return
     */
    public static String computeMaxRepeatString(String str) {

        String maxNumberKey = null;
        Integer maxNumberNumber = 0;
        int len = str.length();

        if (len < 1) {
            throw new RuntimeException("string is empty");
        }

        if (len < 2) {
            return str.charAt(0) + "";
        }

        for (int i = 2; i <= len; i++) {//i = 2意思是至少两个字符才开始算字符串

            Object[] maxValue = computeMaxRepeatString(str, i);

            String numberKey = (String) maxValue[0];
            Integer numberNumber = (Integer) maxValue[1];

            if (numberNumber >= maxNumberNumber || numberNumber >= 2) {
                maxNumberKey = numberKey;
                maxNumberNumber = numberNumber;
            }
        }
        return maxNumberKey;
    }

    private static Object[] computeMaxRepeatString(String str, int count) {

        Map<String, Integer> numberMap = new HashMap<>();
        String maxNumberKey = null;
        Integer maxNumberNumber = 0;

        for (int i = 0; i <= str.length() - count; i++) {

            String temp = str.substring(i, i + count);

            Integer charNumber = numberMap.get(temp);
            if (charNumber == null) {
                charNumber = 1;
            } else {
                charNumber++;
            }
            numberMap.put(temp, charNumber);

            if (maxNumberKey == null) {
                maxNumberKey = temp;
                maxNumberNumber = charNumber;
            } else {
                if (charNumber > maxNumberNumber) {
                    maxNumberKey = temp;
                    maxNumberNumber = charNumber;
                }
            }
        }
        return new Object[] { maxNumberKey, maxNumberNumber };
    }
}

打印结果:
ttabcftrgabcd中最长的重复字符串:abc
canffcancd中最长的重复字符串:can

A中最长的重复字符串:A
AB中最长的重复字符串:AB

ABCDBCD中最长的重复字符串:BCD
ABCDBCDCD中最长的重复字符串:BCD

ABCDABCDCD中最长的重复字符串:ABCD
ABCDABCDBCDCD中最长的重复字符串:ABCD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值