华为OD机试真题 Java 实现【挑选字符串】【2023 B卷 100分】,附详细解题思路
发布人:shili8
发布时间:2025-01-16 07:37
阅读次数:0
**华为OD机试真题 Java 实现**
**挑选字符串**
**2023 B 卷100 分**
**题目描述**
给定一个长度为 n 的字符串 S 和一个长度为 m 的子串 T,要求找出在 S 中出现的最长连续子串,其所有字符都与 T 相同。
**输入输出格式**
* 输入:两个长度分别为 n 和 m 的字符串 S 和 T* 输出:最长连续子串的长度**示例**
* 输入:S = "abcabc", T = "bc"
* 输出:2**解题思路**
1. **前缀和数组**:首先,我们需要计算出两个字符串 S 和 T 的前缀和数组。前缀和数组是指每个位置的前缀中出现过的不同字符数量。
2. **滑动窗口法**:然后,我们使用滑动窗口法来找到最长连续子串,其所有字符都与 T 相同。在这个过程中,我们需要维护一个滑动窗口,表示当前我们正在考虑的子串。我们需要计算出滑动窗口内出现过的不同字符数量,并且保证这个数量不超过 m。
3. **更新答案**:当我们找到满足条件的最长连续子串时,我们需要更新答案。
**Java 实现**
javapublic class Main { public static void main(String[] args) { String S = "abcabc"; String T = "bc"; System.out.println(solve(S, T)); } public static int solve(String S, String T) { int n = S.length(); int m = T.length(); // 前缀和数组 int[] prefixSumS = new int[n +1]; for (int i =0; i < n; i++) { prefixSumS[i +1] = prefixSumS[i] + (S.charAt(i) == T.charAt(0) ?1 :0); } // 滑动窗口法 int ans =0; for (int i =0; i <= n - m; i++) { int[] window = new int[m]; for (int j =0; j < m; j++) { if (S.charAt(i + j) == T.charAt(j)) { window[j] =1; } } // 更新答案 int sum =0; for (int k : window) { sum += k; } ans = Math.max(ans, sum); } return ans; } }
**详细解题思路**
* **前缀和数组**:首先,我们需要计算出两个字符串 S 和 T 的前缀和数组。前缀和数组是指每个位置的前缀中出现过的不同字符数量。在这个过程中,我们需要维护一个前缀和数组,表示当前我们正在考虑的子串。
* **滑动窗口法**:然后,我们使用滑动窗口法来找到最长连续子串,其所有字符都与 T 相同。在这个过程中,我们需要维护一个滑动窗口,表示当前我们正在考虑的子串。我们需要计算出滑动窗口内出现过的不同字符数量,并且保证这个数量不超过 m。
* **更新答案**:当我们找到满足条件的最长连续子串时,我们需要更新答案。
**注意**
* 这个问题要求找出在 S 中出现的最长连续子串,其所有字符都与 T 相同。因此,我们需要使用滑动窗口法来找到这个子串。
* 在这个过程中,我们需要维护一个前缀和数组,表示当前我们正在考虑的子串。
* 我们需要计算出滑动窗口内出现过的不同字符数量,并且保证这个数量不超过 m。
**总结**
在本题中,我们使用了滑动窗口法来找到最长连续子串,其所有字符都与 T 相同。在这个过程中,我们需要维护一个前缀和数组,表示当前我们正在考虑的子串。我们需要计算出滑动窗口内出现过的不同字符数量,并且保证这个数量不超过 m。最后,我们更新答案。
**参考**
* [华为OD机试真题 Java 实现]( />* [Java 实现滑动窗口法](