import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param words string字符串一维数组
     * @return int整型
     */
    public int findLongestSubstring (String s, String[] words) {
        // write code here
        // 将所有的单词拼接成一个模式串
        StringBuilder patternBuilder = new StringBuilder();
        for (String word : words) {
            patternBuilder.append(word);
        }
        String pattern = patternBuilder.toString();

        int n = s.length();
        int m = pattern.length();

        // 计算模式串的next数组
        int[] next = new int[m];
        computeNextArray(pattern, next);

        int i = 0; // 主串的指针
        int j = 0; // 模式串的指针
        int start = -1;
        int maxLength = -1;

        while (i < n) {
            if (s.charAt(i) == pattern.charAt(j)) {
                ++i;
                ++j;
            } else {
                if (j > 0) {
                    j = next[j - 1];
                } else {
                    ++i;
                }
            }

            if (j == m) {
                // 找到了一个匹配的子串
                if (i - j > maxLength) {
                    maxLength = i - j;
                    start = i - m;
                }
                // 继续寻找下一个匹配位置
                j = next[j - 1];
            }
        }

        return start;
    }
    private void computeNextArray(String pattern, int[] next) {
        int m = pattern.length();
        int j = 0; // 模式串的指针

        for (int i = 1; i < m; ++i) {
            while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) {
                j = next[j - 1];
            }

            if (pattern.charAt(i) == pattern.charAt(j)) {
                ++j;
            }

            next[i] = j;
        }
    }
}

Java代码。

该题考察的知识点是字符串处理和KMP算法。

使用一个StringBuilder对象patternBuilder来拼接所有的单词,形成模式串pattern

创建一个整型数组next来保存模式串的next数组。调用computeNextArray方法计算模式串的next数组。

使用两个指针ij分别表示主串和模式串的指针,以及startmaxLength来记录最长连续子串的起始位置和长度。

在循环中,通过比较当前字符是否匹配,更新指针的位置。如果匹配失败且j大于0,则将j更新为next[j - 1],否则将i向右移动一位。如果匹配成功,则将ij都向右移动一位。

j等于模式串长度时,表示找到了一个匹配的子串。如果该子串的长度大于当前最大长度,则更新最大长度maxLength和起始位置start

返回最长连续子串的起始位置start