LeetCode:1446.连续字符

67 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

1446.连续字符

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…

给你一个字符串 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[i1]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(N2)O(N^2)
    • O(N)O(N)
    • O(N)O(N)
  • 空间复杂度:
    • O(1)O(1)
    • O(1)O(1)
    • O(1)O(1)