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