侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【字符串, 哈希表】两个相同字符之间的最长子字符串

GabrielxD
2022-09-17 / 0 评论 / 0 点赞 / 17 阅读 / 502 字 / 正在检测是否收录...

题目

1624. 两个相同字符之间的最长子字符串


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

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

提示:

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

解题

方法一:哈希表 一次遍历

思路

维护一个哈希表(firstSeen),记录每个字符第一次在字符串中出现的下标。
遍历字符串,如果当前字符还没在字符串中出现过,就把下表放入哈希表;否则算出当前字符的位置与它第一次出现位置的距离,然后维护最大长度(maxLne)即可。

代码

class Solution {
    public int maxLengthBetweenEqualCharacters(String s) {
        int[] firstSeen = new int[26];
        Arrays.fill(firstSeen, -1);
        int maxLen = -1;
        for (int i = 0; i < s.length(); ++i) {
            int curr = s.charAt(i) - 'a';
            if (firstSeen[curr] == -1) firstSeen[curr] = i;
            else maxLen = Math.max(maxLen, i - firstSeen[curr] - 1);
        }
        return maxLen;
    }
}
class Solution {
public:
    int maxLengthBetweenEqualCharacters(string s) {
        int first_seen[26];
        memset(first_seen, -1, sizeof(first_seen));
        int max_len = -1;
        for (int i = 0; i < s.length(); ++i) {
            int curr = s[i] - 'a';
            if (first_seen[curr] == -1) first_seen[curr] = i;
            else max_len = max(max_len, i - first_seen[curr] - 1);
        }
        return max_len;
    }
};
0

评论区