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

题目:

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

难度:简单

示例 :

输入:s = "aa"
输出:0
解释:最优的子字符串是两个 'a' 之间的空子字符串。
输入:s = "cbzxy"
输出:-1
解释:s 中不存在出现出现两次的字符,所以返回 -1 。

题解:

题目要求求出两个相同字符之间的最长子字符串的长度。对于字符 \textit{ch}ch,只需要求出 \textit{ch}ch 第一次出现在字符串中的索引位置 \textit{first}first 和最后一次出现在字符串中的索引位置 \textit{last}last,则以 \textit{ch}ch 为相同字符之间的子字符串的最大长度一定为 \textit{last} - \textit{first} - 1last−first−1,我们依次求出所有可能的子字符的长度的最大值即可。我们设数组 \textit{firstIndex}firstIndex 记录每个字符 ii 在字符串中第一次出现的索引,\textit{maxLength}maxLength 表示当前子字符串的最大长度。

初始化时 \textit{firstIndex}firstIndex 中的每个元素都初始化为 -1−1,表示该字符还未出现。
当遍历到第 ii 个字符 \textit{ch}ch 时,如果当前数组中 \textit{firstIndex}[\textit{ch}] = -1firstIndex[ch]=−1,则记录该字符第一次出现的索引为 ii,更新 \textit{firstIndex}[\textit{ch}] = 1firstIndex[ch]=1;如果当前数组中 \textit{firstIndex}[\textit{ch}] \ge 0firstIndex[ch]≥0 时,则表示字符 \textit{ch}ch 之前已经出现过,此时两个 \textit{ch}ch 之间的子字符串长度为 i - \textit{firstIndex}[\textit{ch}] - 1i−firstIndex[ch]−1,同时更新 \textit{maxLength}maxLength。
返回最大的长度 \textit{maxLength}maxLength 即可。

int maxLengthBetweenEqualCharacters(char * s){
    int i,j,len=strlen(s);
    int maxlen=-1;
    int a[26];
    memset(a,-1,sizeof(a));
    for(i=0;i<len;i++){
        if(a[s[i]-'a']==-1){
            a[s[i]-'a']=i;
        }
    
    else 
    {
        int tempsize=i-a[s[i]-'a']-1;
        maxlen=(maxlen<tempsize) ? tempsize:maxlen;
    }
}

return maxlen;
}

 

 
 

 

posted @   一树懒  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示