How to Find Positions of Large Groups using Two Pointer Algorith
- 时间:2020-09-30 16:23:25
- 分类:网络文摘
- 阅读:176 次
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
Two Pointer Algorithm using Java
This problem is similar to the run-length compression coding, which we need to find the continuous group of characters. We use two pointers, i and j, where i is the beginning of the group and j is the end of the group until we reach the end of the string.
The following Java implementation uses Arrays.asList to convert a Integer array to a List of Integer.
The complexity is O(N) in both space and time. The first pointer i will jump to the end of the group i.e. second pointer j at the end of each group.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public List<List<Integer>> largeGroupPositions(String S) { List<List<Integer>> res = new ArrayList(); int i = 0, len = S.length(); while (i < len) { int j = i + 1; while (j < len && S.charAt(j) == S.charAt(i)) { j ++; // until the group ends } if (j - i + 1 > 3) { res.add( Arrays.asList(new Integer[]{i, j - 1}) ); } i = j; } return res; } } |
class Solution {
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> res = new ArrayList();
int i = 0, len = S.length();
while (i < len) {
int j = i + 1;
while (j < len && S.charAt(j) == S.charAt(i)) {
j ++; // until the group ends
}
if (j - i + 1 > 3) {
res.add( Arrays.asList(new Integer[]{i, j - 1}) );
}
i = j;
}
return res;
}
}Two Pointer Algorithm using C++
C++ implementation will be slightly more concise as we can directly use {} to denote a vector.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution { public: vector<vector<int>> largeGroupPositions(string S) { vector<vector<int>> res; int i = 0, len = S.size(); while (i < len) { int j = i + 1; while (j < len && S[j] == S[i]) { j ++; // find end of the group } if (j - i + 1 > 3) { res.push_back( {i, j - 1} ); } i = j; } return res; } }; |
class Solution {
public:
vector<vector<int>> largeGroupPositions(string S) {
vector<vector<int>> res;
int i = 0, len = S.size();
while (i < len) {
int j = i + 1;
while (j < len && S[j] == S[i]) {
j ++; // find end of the group
}
if (j - i + 1 > 3) {
res.push_back( {i, j - 1} );
}
i = j;
}
return res;
}
};–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:How to Print Immutable Linked List in Reverse using Recursion or The Most Useful Tools for Reverse Phone Lookup How to Solve the WIFI (Wireless Networks) Intermittency Issues? How to Reverse a Linked List in Javascript? Bash Function to Check if a Kubernetes Pod Name is Valid VBScript Function to Convert an Integer to Binary String Represe Find Maximum Connected Colors (Values) in a 2D Grid using DFS or Algorithms to Shift a 2D Grid/Matrix In-Place How Martha Stewart Became One Of The Best Bloggers On The Web Social Media and Dating Apps: How They’re Changing Love
- 评论列表
-
- 添加评论