
Together for a Shared future
一起向未来



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

题目描述

给你一个字符串 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 只包含小写英文字母。

双指针算法

/**
* 双指针算法
*
* 执行用时: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;
}

滑动窗口法

/**
* 滑动窗口法
*
* 执行用时: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;
}

复杂度分析

时间复杂度:O(n),其中 n 是字符串 s 的长度。遍历一次 s 的时间复杂度为 O(n)。
空间复杂度:O(1),我们只需要常数的空间保存若干变量。
后端技术&架构精华

《源码系列》
《经典书籍》
《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》
《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》
《服务端技术栈》
《算法系列》
《设计模式》
《LeetCode题库》
《LeetCode 383:ransomNote(赎金信)》
扫描二维码
获取技术干货
后台技术汇

好文!点个好看!
本文介绍了如何使用Java解决字符串能量最大值的问题,分别通过双指针和滑动窗口两种算法进行求解,每种方法都给出了执行时间和空间复杂度的分析,并附带了实际代码实现。此外,文章还涉及到了后端技术与架构的相关知识,如源码解析、并发编程、设计模式等。
335

被折叠的 条评论
为什么被折叠?



