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 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),我们只需要常数的空间保存若干变量。