LeetCode算法題-Positions of Large Groups(Java實現)

這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章