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

一、题目

给你一个字符串 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(...)返回最长的字符串子串长度。具体操作如下图所示(为了便于描述,下图存储结构以哈希表存储):

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

四、代码实现

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;
    }
}

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

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

你可能感兴趣的:(算法,leetcode,算法,java,面试)