持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
一、题目描述:
1624. 两个相同字符之间的最长子字符串 - 力扣(LeetCode)
给你一个字符串 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 只含小写英文字母
二、思路分析:
虽然是简单题的解题思路,但也可以锻炼下自己的表达能力,要把自己的想法表达清楚:
1、相同字符之间的最大距离,首先就是想到了需要记录字符串,以及他的位置信息,所以使用哈希表key:字符值 value:位置
2、遍历字符串,把字符依次放入哈希表,放入哈希表时,有两个场景:
3、场景一:如果不存在,那么该字符是第一次被遍历到,那么按照定义规则放入哈希表
4、场景二:如果存在,那么必然是第二次遍历到,这时可以用字符当前位置,减去哈希表中字符的位置,算出距离,注意要多减一个1
遍历的同时,要取出距离的最大值,就是本地答案。
三、AC 代码:
class Solution {
public int maxLengthBetweenEqualCharacters(String s) {
char[] ch=s.toCharArray();
int head=0,tail=0;
for(int i=0;i<ch.length;i++)
{
for(head=0,tail=ch.length-i-1;tail<ch.length;tail++,head++)
{
if(ch[head]==ch[tail])
return tail-head-1;
}
}
return -1;
}
};
四、参考: