【LeetCode】 连续字符Java题解

135 阅读2分钟

这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

题目描述

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串的能量。

示例 1:

输入:s = "leetcode"
输出:2
解释:子字符串 "ee" 长度为 2 ,只包含字符 'e' 。

示例 2:

输入:s = "abbcccddddeeeeedcba"
输出:5
解释:子字符串 "eeeee" 长度为 5 ,只包含字符 'e' 。

示例 3:

输入:s = "triplepillooooow"
输出:5

示例 4:

输入:s = "hooraaaaaaaaaaay"
输出:11

示例 5:

输入:s = "tourist"
输出:1


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是字符串处理题目,题目要求求出只包含一种字符的最长非空子字符串的长度。。根据题意,我们采取双指针的解题思想,记录当前位置i, 和位置i的字符,然后设置指针j, s.charAt(j) 与 s.charAt(i) 比较,找到第一个不相同的地方,使用 j - i 记录当前的子串长度,然后动态更新最大子串长度。实现代码如下:
  • 双指针在线性数据结构中,比如:数组,链表等线性结构中应用比较广泛。通过两个指针的移动,提升执行效率。在链表中,判断链表有没有环也常常使用双指针。

通过代码

class Solution {
    public int maxPower(String s) {
        int ans = 0;
        int n = s.length();
        if (n == 0) {
            return ans;
        }
        ans = 1;
        int j = 0;
        for (int i = 0; i < n; ) {
            char temp = s.charAt(i);
            j = i + 1;
            while (j < n && temp == s.charAt(j)) {
                j++;
            }
            ans = Math.max(ans, j - i);
            i = j;
        }

        return ans;
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(1)
  • 坚持算法每日一题,加油!