📜  门| GATE-CS-2017(套装1)|第 54 题(1)

📅  最后修改于: 2023-12-03 15:12:44.143000             🧑  作者: Mango

题目介绍

这道题目来自于 GATE-CS-2017(套装1) 试卷,题号为第 54 题。本题考察了程序员关于Java语言中字符串处理的知识。

题目描述

给定一个字符串s,编写一个Java方法,找到一个最长的子字符串,这个子字符串既是s的前缀,也是s的后缀。

输入格式

字符串s,长度不超过1000

输出格式

最长的子字符串

样例输入
ababcabab
样例输出
abab

解题思路

这道题目需要我们找到一个最长的子字符串,且这个子字符串既是s的前缀,也是s的后缀。那么我们可以使用算法提取出s的前缀和后缀,然后再进行比较,找出最长的相等的字符串即可。

具体实现上,我们可以使用KMP算法来提取s的前缀和后缀。KMP算法的实现可以参考这里。提取前缀和后缀后,我们只需要找到最长的相等的字符串即可。

下面是基于KMP算法的实现。

public String longestPrefixSuffix(String s) {
    int[] table = buildKMPTable(s);
    int n = s.length();
    int len = table[n - 1];
    while (len > 0) {
        int idx = n - 1 - len;
        String prefix = s.substring(0, len);
        String suffix = s.substring(idx + 1, n);
        if (prefix.equals(suffix)) {
            return prefix;
        }
        len = table[len - 1];
    }
    return "";
}

// 构建KMP表
private int[] buildKMPTable(String s) {
    int[] table = new int[s.length()];
    int j = 0;
    for (int i = 1; i < s.length(); i++) {
        while (j > 0 && s.charAt(i) != s.charAt(j)) {
            j = table[j - 1];
        }
        if (s.charAt(i) == s.charAt(j)) {
            j++;
        }
        table[i] = j;
    }
    return table;
}

总结

本道题目考察了程序员对于Java语言字符串处理的理解,以及对KMP算法的掌握。只有掌握了基础的字符串处理技术,才能够应对实际场景中的字符串问题。