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(赎金信)》
扫描二维码
获取技术干货
后台技术汇
好文!点个好看!