這是悅樂書的第323次更新,第346篇原創
01 看題和準備
今天介紹的是LeetCode算法題中Easy級別的第193題(順位題號是830)。在由小寫字母組成的字符串S中,那些相同的連續字符會組成集合。例如,諸如S =“abbxxxxzyy”的字符串具有集合“a”,“bb”,“xxxx”,“z”和“yy”。
如果集合有3個或更多字符,稱之爲大集合,要求找到每個大集合的起點和終點,以數組形式返回,以從前往後順序。例如:
輸入:“abbxxxxzzy”
輸出:[[3,6]]
說明:“xxxx”是具有起始位置3和結束位置6的單個大集合。
輸入:“abc”
輸出:[]
說明:我們有“a”,“b”和“c”,但沒有大集合。
輸入:“abcdddeeeeaabbbcd”
輸出:[[3,5],[6,9],[12,14]]
注意:1 <= S.length <= 1000
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 解題
題目的意思很明確,要求找到字母連續出現3次及以上且字母相同的子串,取其起始索引,作爲數組返回,並且只能是從前往後的順序。在遍歷字符串中的字母時,還需要記數,判斷出現次數,滿足條件就取開始索引、結束索引存入List中。
第一步,初始化結果數組,S的長度n。
第二步,遍歷S中的字符,定義兩個變量,count統計出現次數,index記錄開始索引。使用一個循環,從當前位置開始往後遍歷查找,遇到相同字符,count加1,直到遇上不相等的字符或者遍歷完右邊剩下的字符。接着判斷,如果count大於等於3,說明符合題目條件,新創建一個List,將起始索引add進去,再將List添加進結果數組中去。
第三步,返回結果數組。
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
int n = S.length();
for (int i=0; i<n-1; i++) {
int count = 1;
int index = i;
while (i+1 < n && S.charAt(i) == S.charAt(i+1)) {
count++;
i++;
}
if (count >= 3) {
List<Integer> list = new ArrayList<Integer>();
list.add(index);
list.add(i);
result.add(list);
}
}
return result;
}
03 小結
算法專題目前已日更超過五個月,算法題文章193+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!