毎日の質問をLeetcode [830。より大きなグループの場所]

1.タイトルの説明

小文字で構成される文字列sには、連続する同一の文字のグループが含まれます。

たとえば、文字列s = "abbxxxxzyy"には、 "a"、 "bb"、 "xxxx"、 "z"、 "yy"などのグループがあります。

グループ化は、間隔[start、end]で表すことができます。ここで、startとendは、それぞれグループの開始位置と終了位置の添え字を表します。上記の例の「xxxx」グループは、間隔[3,6]で表されます。

3文字以上の連続した文字を含むすべてのグループをより大きなグループと呼びます。

大きいグループ化間隔をそれぞれ見つけ、開始位置インデックスで昇順で並べ替えて、結果を返します。

例1:

入力:s = "abbxxxxzzy"
出力:[[3,6]]
説明: "xxxx"は、3で始まり6で終わるより大きなグループです。

例2:

入力:s = "abc"
出力:[]
説明: "a"、 "b"、および "c"は、要件を満たす大きなグループではありません。

例3:

入力:s = "abcdddeeeeaabbbcd"
出力:[[3,5]、[6,9]、[12,14]]
説明:より大きなグループは「ddd」、「eeee」、「bbb」です。

例4:

入力:s = "aba"
出力:[]

促す:

1 <= s.length <= 1000
s 仅含小写英文字母

出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/positions-of-large-groups
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

2つ、アイデアとコード

1.1サイクル

各リスト要素をトラバースします。次の要素が前の要素と等しい場合は+1をカウントします。それ以外の場合は、ループリストが最後まであり、現在の要素が次の要素と等しくない場合は、カウント> = 3かどうかを判断し、追加します。条件が満たされている場合リスト。

def largeGroupPositions(s):
        res = []
        if len(s) < 3:
            return res
        num = 0
        for i in range(len(s)):
            if i == len(s) - 1 or s[i] != s[i + 1]: #到达尾部或者与下一个值不同,判断长度
                if num >= 2:
                    res.append([i - num , i])
                num = 0
            else:
                num += 1
        return res


res =largeGroupPositions("abbxxxxzzy")

print(res)

2.その他のアイデア(解決策を参照してください)

正規表現を使用する

class Solution:
    def largeGroupPositions(self, s: str) -> List[List[int]]:
        res,idx=[],0
        for i,j in re.findall(r'([a-z])(\1*)',s):
            if len(j)>=2:
                res.append([idx,idx+len(j)])
            idx += 1+len(j)
        return res

おすすめ

転載: blog.csdn.net/qq_49821869/article/details/112255394