图解LeetCode——1624. 两个相同字符之间的最长子字符串(难度:简单)

2023-05-10 11:39:12 浏览数 (1)

一、题目

给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1

子字符串 是字符串中的一个连续字符序列。

二、示例

2.1> 示例 1:

【输入】s = "aa" 【输出】0 【解释】最优的子字符串是两个 'a' 之间的空子字符串。

2.2> 示例 2:

【输入】s = "abca" 【输出】2 【解释】最优的子字符串是 "bc" 。

2.3> 示例 3:

【输入】s = "cbzxy" 【输出】-1 【解释】s 中不存在出现出现两次的字符,所以返回 -1 。

2.4> 示例 4:

【输入】s = "cabbac" 【输出】4 【解释】最优的子字符串是 "abba" ,其他的非最优解包括 "bb" 和 "" 。

提示:

  • 1 <= s.length <= 300
  • s 只含小写英文字母

三、解题思路

根据题意,既然要计算两个相同字符直接的最长长度,那么我们可以将其保存在哈希表中,key=字符 value=下标。那么,本题的约束条件中指明,s只包含小写英文字母,所以,我们可以采用数组结构来实现哈希表的功能,其中:

数组的下标:是字符的ASCII码减97(因为a的ASCII码是97,这样可以映射到数组的下标0的位置)。 数组存储的值:就是该字符第一次出现的位置。

那么,我们遍历字符串s中的每个字符,如果发现了重复的字符,计算长度即可,最终通过Math.max(...)返回最长的字符串子串长度。具体操作如下图所示(为了便于描述,下图存储结构以哈希表存储):

四、代码实现

代码语言:javascript复制
class Solution {
    public int maxLengthBetweenEqualCharacters(String s) {
        int result = -1;
        int[] charIndex = new int[26];
        Arrays.fill(charIndex, -1);
        char[] sc = s.toCharArray();
        for (int i = 0; i < sc.length; i  ) {
            if (charIndex[sc[i] - 97] == -1) charIndex[sc[i] - 97] = i;
            else result = Math.max(result, i - charIndex[sc[i] - 97] - 1);
        }
        return result;
    }
}

0 人点赞