LeetCode 1446:Consecutive Characters(连续字符)

7343061a58565d97990558995e2cfe36.png

Together for a Shared future

一起向未来

cd9cd52301755cd2ad7b8b81b7a7fac2.png

aeaff4f25827690d5977dad99c9f17da.png

4b76a96eccd44da77d97530958992a46.png

今天带来的一道简单的算法题目《1446. 连续字符串》。

ba2b68e0bfa0c2783c85e7a98d98af9d.png

题目描述

ff1521f0d500fdb62e69a2d9e322ac8f.png

给你一个字符串 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

    提示:

  • 1 <= s.length <= 500

  • s 只包含小写英文字母。

c2565e2bd25fc3415c5fad569c858e9f.png

双指针算法

7ed627386a817cce62ea12d0cb0194e3.png

/**
     * 双指针算法
     *
     * 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
     * 内存消耗:39.9  MB, 在所有 Java 提交中击败了5.05%的用户
     * @param s
     * @return
     */
    public static int maxPowerV1(String s) {
        if (s.length() == 0) {
            return 0;
        }


        int max = 1;
        for (int left = 0; left < s.length();) {
            // left 指向字符串首字符
            char ch = s.charAt(left);
            int right = left;
            // right 指向left所在字符
            for (; right < s.length(); right++) {
                if (ch == s.charAt(right)) {
                    continue;
                } else{
                    break;
                }
            }


            // 计算最大长度
            max = ((right - left) > max) ? (right - left) : max;
            // 重置left指针
            left = right;
        }
        return max;
    }

883af0bffd6e203265f5cbff3023bbd8.png

滑动窗口法

ae342198e692ff9cbd6f48f88f092c7a.png

/**
     * 滑动窗口法
     *
     * 执行用时:2 ms, 在所有 Java 提交中击败了13.19%的用户
     * 内存消耗:40 MB, 在所有 Java 提交中击败了5.05%的用户
     * @param s
     * @return
     */
    public static int maxPowerV2(String s) {
        if (s.length() == 0) {
            return 0;
        }


        int max = 1;
        int left = 0;
        int right = 1;
        // 直到右指针停止到末尾
        while ( right < s.length() ) {
            if (s.charAt(left) == s.charAt(right)) {
                right++;
            } else {
                left++;
            }
            max = Math.max(max, (right - left));
        }
        return max;
    }

eae3c7e223d97285e98e0d8d85374a38.png

复杂度分析

71b9c97b655fcb487f49a585eb7f36b5.png

时间复杂度:O(n),其中 n 是字符串 s 的长度。遍历一次 s 的时间复杂度为 O(n)。

空间复杂度:O(1),我们只需要常数的空间保存若干变量。

后端技术&架构精华

fb525b338e4031d18c8fa8a0f8f3863f.png

《源码系列》

JDK之Object 类

JDK之BigDecimal 类

JDK之String 类

JDK之Lambda表达式

Spring源码:Event事件发布与监听

《经典书籍》

Java并发编程实战:第1章 多线程安全性与风险

Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制

Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭

《服务端技术栈》

《Docker 核心设计理念

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

读懂排序算法(一):冒泡&直接插入&选择比较

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

《读懂排序算法(六):二分查找算法》

《设计模式》

设计模式之六大设计原则

设计模式之创建型(1):单例模式

设计模式之创建型(2):工厂方法模式

设计模式之创建型(3):原型模式

设计模式之创建型(4):建造者模式

设计模式之创建型(5):抽象工厂设计模式

《LeetCode题库》

LeetCode 383:ransomNote(赎金信)

扫描二维码

获取技术干货

后台技术汇

6c15c9504bbe694c00f95cedfaf1073d.png

好文!点个好看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值