题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
说明:
- 1 <= S.length <= 1000
二、解题思路
-
遍历字符串,判断当前元素与前一元素是否相同,相同时,记录次数的变量加 1
-
不同时,判断上一元素连续出现的次数是否大于等于 3,大于等于时,添加起始索引与结束索引至结果列表中
-
并将记录次数的变量重置为 1
遍历结束后,需要判断最后的 count 是否大于等于 3,因为最后一位元素也可能是连续出现次数大于等于 3 次的元素,而在循环中未进行添加的操作
三、代码实现
public static List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> ans = new ArrayList<>();
// 空值判断与长度为 0 的判断
if (S == null || S.length() < 1) {
return ans;
}
char[] sarr = S.toCharArray();
List<Integer> list = null;
// 记录元素连续出现的次数
int count = 1;
for (int i = 1; i < sarr.length; i++) {
if (sarr[i] == sarr[i - 1]) {
count ++;
} else {
// 当前元素与前一元素不同时,对上一较大分组元素进行添加
if (count > 2) {
list = new ArrayList<>();
list.add(i - count);
list.add(i - 1);
ans.add(list);
}
count = 1;
}
}
// 最后一位也是较大分组中的元素时的情况
if (count > 2) {
list = new ArrayList<>();
list.add(sarr.length - count);
list.add(sarr.length - 1);
ans.add(list);
}
return ans;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String str = "abbxxxxzzy"; // output: {{3, 6}}
// String str = "abc"; // output: {}
// String str = "abcdddeeeeaabbbcd"; // output: {{3, 5}, {6, 9}, {12, 14}}
List<List<Integer>> result = largeGroupPositions(str);
System.out.println(result);
}