LeetCode2414题: 最长的字母序连续子字符串的长度(原创)

【题目描述】

字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。

  • 例如,"abc" 是一个字母序连续字符串,而 "acb" 和 "za" 不是。

给你一个仅由小写英文字母组成的字符串 s ,返回其 最长 的 字母序连续子字符串 的长度。

示例 1:

输入:s = "abacaba"
输出:2
解释:共有 4 个不同的字母序连续子字符串 "a"、"b"、"c" 和 "ab" 。
"ab" 是最长的字母序连续子字符串。

示例 2:

输入:s = "abcde"
输出:5
解释:"abcde" 是最长的字母序连续子字符串。

提示:

  • 1 <= s.length <= 105
  • s 由小写英文字母组成

题目链接:. - 力扣(LeetCode)

【解题代码】

public class LongestContinuousSubstring {

    public static void main(String[] args) {
        String s = "abcde"; //"abacaba";
        int result = new LongestContinuousSubstring().longestContinuousSubstring(s);
        System.out.println("最长的字母序连续子字符串的长度:" + result);
    }

    public int longestContinuousSubstring(String s) {
        int maxLen = 0, curLen = 1;
        int cur = 1;

        char lastChar = s.charAt(0);
        while (cur < s.length()) {
            char curChar = s.charAt(cur);
            if (curChar - lastChar == 1){
                curLen++;
                if (curLen == 26) return 26;
            } else{
                if (curLen > maxLen) maxLen = curLen;
                curLen = 1;
            }
            lastChar = curChar;
            cur++;
        }
        return curLen > maxLen ? curLen : maxLen;
    }

    public int longestContinuousSubstring1(String s) {
        int maxLen = 0, curLen = 1;
        int cur = 1;

        while (cur < s.length()) {
            if (s.charAt(cur) - s.charAt(cur - 1) == 1){
                curLen++;
                if (curLen == 26) return 26;
            } else{
                if (curLen > maxLen) maxLen = curLen;
                curLen = 1;
            }
            cur++;
        }
        return curLen > maxLen ? curLen : maxLen;
    }

}

【解题思路】

根据题目描述,感觉这道题应该比较简单,就是从头到尾不断比较字符串中相邻得两个字符,如果后一个字符比前一个字符大1,那么当前子字符串就是连续的,将其长度加1,如果不是,那么当前连续子字符串就到此为止,重新开始计算新的子字符串。按照这个思路很快完成编码,并提交成功

【解题步骤】

  1. 定义相关变量:最大子字符串长度maxLen,当前子字符串长度curLen,当前字符串索引值cur,上一字符lastChar等
    int maxLen = 0, curLen = 1;
    int cur = 1;
    char lastChar = s.charAt(0);
  2. 从头到尾依次获取字符串当前字符
    while (cur < s.length()) {
        char curChar = s.charAt(cur);
  3. 如果当前字符串比上一字符串大1,那么当前子字符串就是连续的,将其长度加1
     if (curChar - lastChar == 1){
        curLen++;
        if (curLen == 26) return 26;
    } 
  4. 否则那么当前连续子字符串就到此为止,重新开始计算新的子字符串
    else{
        if (curLen > maxLen) maxLen = curLen;
            curLen = 1;
    }
  5. 更新上一字符串值,以及更新当前字符串索引
    lastChar = curChar;
    cur++;
  6. 返回最终结果
    return curLen > maxLen ? curLen : maxLen;

【思考总结】

  1. 此题算法实现思路:从头到尾不断比较字符串中相邻得两个字符,如果后一个字符比前一个字符大1,那么当前子字符串就是连续的,将其长度加1,如果不是,那么当前连续子字符串就到此为止,重新开始计算新的子字符串。
  2. LeetCode解题之前,一定不要看题解,看了就“破功”了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值