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
<Solution>想法如下
- 通常 String 找區間的題目,可以先用雙指標來思考一下
- 先固定一個位置,然後開始歷遍。當遇到不同字元時,檢查當下的區間是不是符合 group 的定義,是的話就記錄下來。然後不論區間是不是答案之一,都要更新固定的位置,以用來做新的比對
Java(參考解法)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public List<List<Integer>> largeGroupPositions(String S) { | |
List<List<Integer>> ans = new ArrayList<>(); | |
final int len = S.length(); | |
int anchor = 0, upperBound = len - 1; | |
for(int i = 0; i < len; i++) { | |
if(i == upperBound || S.charAt(i) != S.charAt(i+1)) { | |
if(i - anchor >= 2) { | |
ans.add(Arrays.asList(new Integer[]{anchor, i})); | |
} | |
anchor = i+1; | |
} | |
} | |
return ans; | |
} | |
} |
沒有留言:
張貼留言