leetcode:1446.连续字符

题目

来源:力扣(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[i1] ,则将 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)

猜你喜欢

转载自blog.csdn.net/uncle_ll/article/details/121667248
今日推荐