NC142 最长重复子串

  算法   3分钟   690浏览   0评论

题目链接:https://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc

题目描述

定义重复字符串是由两个相同的字符串首尾拼接而成。例如:"abcabc" 是一个长度为 6 的重复字符串,因为它由两个 "abc" 串拼接而成;"abcba" 不是重复字符串,因为它不能由两个相同的字符串拼接而成。

给定一个字符串,请返回其最长重复子串的长度。

若不存在任何重复字符子串,则返回 0。

本题中子串的定义是字符串中一段连续的区间。

数据范围:字符串长度不大于 10^3,保证字符串一定由小写字母构成。

进阶:空间复杂度 O(1),时间复杂度 O(n^2)

示例 1:

输入:"ababc"
返回值:4
说明:abab为最长的重复字符子串,长度为4

示例 2:

输入:"abcab"
返回值:0
说明:该字符串没有重复字符子串

解题代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param a string字符串 待计算字符串
     * @return int整型
     */
    public int solve(String a) {
        // write code here
        if (a == null || a.length() <= 1) return 0;
        char[] chars = a.toCharArray();
        int len = chars.length;
        int maxLen = chars.length / 2;
        for (int i = maxLen; i >= 1; --i) {
            for (int j = 0; j <= len - 2 * i; ++j) {
                if (check(chars, j, i))
                    return 2 * i;
            }
        }
        return 0;
    }

    public boolean check(char[] chars, int start, int len) {
        for (int i = start; i < start + len; ++i) {
            if (chars[i] != chars[i + len])
                return false;
        }
        return true;
    }
}

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论