较大分组的位置
在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 S = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。
最终结果按照字典顺序输出。
示例 1:
输入: "abbxxxxzzy"
输出: [[3,6]]
解释: "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
示例 2:
输入: "abc"
输出: []
解释: "a","b" 和 "c" 均不是符合要求的较大分组。
示例 3:
输入: "abcdddeeeeaabbbcd"
输出: [[3,5],[6,9],[12,14]]
说明: 1 <= S.length <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/positions-of-large-groups
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人的垃圾代码(Java)
class Solution {
public List<List<Integer>> largeGroupPositions(String S) {
char[] chars = S.toCharArray();
List<List<Integer>> result = new ArrayList<>();
List<Integer> newList = new ArrayList<>();
for (int i = 0; i < chars.length - 1; i++) {
//下一个字符
char nc = chars[i + 1];
//当前字符
char oc = chars[i];
//当i为0,初始化0
if (i == 0) {
newList.add(i);
}
//当前字符与下一个字符不同时,放入终止的下标
if (nc != oc) {
newList.add(i);
}
//当倒数第二个字符与倒数第一个字符还相同,并且当前list中只有一个元素时,将末节点放入list中
if (i == chars.length - 2 && newList.size() == 1) {
newList.add(i + 1);
}
//当list的元素数量为2时,判断两个下标之间相差是否大于等于2,即题目中所描述的三个连续字符
if (newList.size() == 2) {
//如果包含,放入返回值list中
if (newList.get(1) - newList.get(0) >= 2) {
result.add(newList);
}
//无论包含与否,清空list,并将下一个节点初始化进list中
newList = new ArrayList<>();
newList.add(i + 1);
}
}
return result;
}
}
- 查看了官方题解,思路与我的方法类似,但是写法更加优雅一点,并且在代码数量上也精简了许多。
class Solution {
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> ans = new ArrayList();
int i = 0, N = S.length(); // i is the start of each group
for (int j = 0; j < N; ++j) {
if (j == N-1 || S.charAt(j) != S.charAt(j+1)) {
// Here, [i, j] represents a group.
if (j-i+1 >= 3)
ans.add(Arrays.asList(new Integer[]{i, j}));
i = j + 1;
}
}
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/positions-of-large-groups/solution/jiao-da-fen-zu-de-wei-zhi-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 本题主要考察的点为
双指针
,利用当前字符与下一个字符做比较。 - 本题存在一个情况,长度为
n
的字符串,循环最后一次只能判断到n-2
。我在题解中发现了一种很巧妙的办法,在我们需要处理的字符串S后拼接一个无关紧要的字符用来占位,也是一种很巧妙的避免数组越界异常(ArrayIndexOutOfBoundsException
)的方法。