🤖
AI审核中

NC142 最长重复子串

本文介绍了“最长重复子串”问题:判断字符串中由两个相同子串相连的最长子串长度,若不存在返回0。字符串长度≤10^3,仅含小写字母。给出 O(n^2) 时间、O(1) 额外空间的解法:从可能的最大子串长度开始枚举,检查相邻两段是否相等,若匹配即返回长度。代码实现包含主函数 solve 与辅助函数 check,遍历并在首次发现符合条件的子串时立即返回结果。

文章摘要

本文介绍了“最长重复子串”问题:判断字符串中由两个相同子串相连的最长子串长度,若不存在返回0。字符串长度≤10^3,仅含小写字母。给出 O(n^2) 时间、O(1) 额外空间的解法:从可能的最大子串长度开始枚举,检查相邻两段是否相等,若匹配即返回长度。代码实现包含主函数 solve 与辅助函数 check,遍历并在首次发现符合条件的子串时立即返回结果。

题目链接: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 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论