830. Positions of Large Groups

830. Positions of Large Groups


题目

Leetcode题目

In a string S of lowercase letters, these letters form consecutive groups of the same character.

For example, a string like S = "abbxxxxzyy" has the groups "a", "bb", "xxxx", "z" and "yy".

Call a group large if it has 3 or more characters. We would like the starting and ending positions of every large group.

The final answer should be in lexicographic order.

Example 1:

Input: "abbxxxxzzy"
Output: [[3,6]]
Explanation: "xxxx" is the single large group with starting  3 and ending positions 6.

Example 2:

Input: "abc"
Output: []
Explanation: We have "a","b" and "c" but no large group.

Example 3:

Input: "abcdddeeeeaabbbcd"
Output: [[3,5],[6,9],[12,14]]

Note: 1 <= S.length <= 1000


解决

遍历字符串,当某一字符的出现次数超过三次,就将该字符的开始和结束下标记录下来。
假设字符串长度为n。

  • 时间复杂度:
  • 空间复杂度:

1.暴力遍历解决

class Solution {
public:
    vector<vector<int>> largeGroupPositions(string S) {
        vector<vector<int> > result;
        int len = S.length();
        int start = 0;
        char front = S[0];
        int times = 1;
        for (int i = 1; i < len; i++) {
            if (S[i] == front) {
                times++;
            } else {
                if (times >= 3) {
                    result.push_back({start, i - 1});
                }
                times = 1;
                front = S[i];
                start = i;
            }
            if (i == len - 1 && times >= 3) {
                result.push_back({start, i});
            }
        }
        return result;
    }
};

2.遍历优化

class Solution {
public:
    vector<vector<int>> largeGroupPositions(string S) {
        vector<vector<int> > result;
        int len = S.length();
        int times = 0;
        int start = 0;
        int end = 0;
        while (start < len) {
            while (S[start] == S[end]) {
                end++;
                times++;
            }
            if (times >= 3) result.push_back({start, end - 1});
            start = end;
            times = 0;
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值