题目
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-characters
给你一个字符串 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 只包含小写英文字母。
解法
- 该题目是一个滑动窗问题,已经排好序了,比较相邻元素是否相同即可
- 解题思路:
- 暴力遍历, 两次遍历
- 一次遍历
- 双指针
暴力二次遍历
- python
class Solution:
def maxPower(self, s: str) -> int:
n = len(s)
maxLen = 1
for i in range(n-1):
currentLen = 1
for j in range(i+1, n):
if s[i] != s[j]:
maxLen = max(maxLen, currentLen)
break
else:
currentLen += 1
maxLen = max(maxLen, currentLen)
return maxLen
- c++
class Solution {
public:
int maxPower(string s) {
int n = s.length();
int maxLen = 1;
for(int i=0; i<n-1; i++)
{
int cnt = 1;
for (int j=i+1; j<n; j++)
{
if(s[i] == s[j])
{
cnt += 1;
maxLen = max(maxLen, cnt);
}
else
{
maxLen = max(maxLen, cnt);
break;
}
}
}
return maxLen;
}
};
一次遍历
初始化当前字符连续出现次数cnt为 1。从 s[1]开始,向后遍历字符串,如果 s [ i ] = s [ i − 1 ] s[i]=s[i-1] s[i]=s[i−1] ,则将 cnt 加一,否则将cnt 重置为1。
维护上述过程中cnt 的最大值,即为答案
- python
class Solution:
def maxPower(self, s: str) -> int:
n = len(s)
maxLen = 1
cnt = 1
for i in range(1, n):
if s[i] == s[i-1]:
cnt += 1
maxLen = max(maxLen, cnt)
else:
cnt = 1
return maxLen
- c++
class Solution {
public:
int maxPower(string s) {
int n = s.length();
int maxLen = 1, cnt = 1;
for(int i=1; i<n; i++)
{
if(s[i] == s[i-1])
{
cnt += 1;
maxLen = max(maxLen, cnt);
}
else
{
cnt = 1;
}
}
return maxLen;
}
};
左右双指针
维护左右两个指针,当左右相等时候,右指针继续向右走,如果两个指针元素不相等时候,左指针变到右指针位置处。
- python
class Solution:
def maxPower(self, s: str) -> int:
n = len(s)
maxLen = 1
left = 0
right = 0
while right < n:
while right < n and s[left] == s[right]:
right += 1
maxLen = max(maxLen, right-left)
left = right
return maxLen
- c++
class Solution {
public:
int maxPower(string s) {
int n = s.length();
int left = 0;
int right = 0;
int maxLen = 1;
while(right < n)
{
while(right < n && s[left] == s[right])
{
right += 1;
}
maxLen = max(res, right-left);
left = right;
}
return maxLen;
}
};
复杂度分析
- 时间复杂度:
- O ( N 2 ) O(N^2) O(N2)
- O ( N ) O(N) O(N)
- O ( N ) O(N) O(N)
- 空间复杂度:
- O ( 1 ) O(1) O(1)
- O ( 1 ) O(1) O(1)
- O ( 1 ) O(1) O(1)