題目來源:https://leetcode-cn.com/problems/compress-string-lccipython
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。好比,字符串aabcccccaaa會變爲a2b1c5a3。若「壓縮」後的字符串沒有變短,則返回原先的字符串。你能夠假設字符串中只包含大小寫英文字母(a至z)。面試
示例1:bash
輸入:"aabcccccaaa" 輸出:"a2b1c5a3"
示例2:微信
輸入:"abbccd" 輸出:"abbccd" 解釋:"abbccd"壓縮後爲"a1b2c2d1",比原字符串長度更長。
提示:函數
思路:雙指針spa
定義雙指針,其中一個指針 i
用於固定起始位置,另一個指針 j
用於移動。.net
移動指針的過程當中,所指元素若與固定指針指向的元素相同時,繼續移動;當元素不一樣時,先記下元素出現的次數,j 指針所在的索引減去 i 指針所在的索引即爲元素出現的次數 j - i重置固定指針 i
的位置爲移動指針 j
所在的位置。其中約束條件爲 i < len(S),j < len(S)
。指針
class Solution: def compressString(self, S: str) -> str: if not S: return "" ans = '' # 初始固定指針索引爲 0 i = 0 length = len(S) while i < length: # 初始雙指針在同一位置 # i 指針固定,j 指針用於移動 j = i # 元素相同時,計算 while j < length and S[j] == S[i]: j += 1 ans += S[i] + str(j - i) i = j return ans if len(ans) < length else S
還有一種方法,不過要藉助 itertools 庫的 groupby 方法。這個方法,在下面的文章中,簡單說起過:code
這裏再簡單介紹下:groupby()
函數運行的機制是先掃描整個序列,同時查找連續相同值的元素序列。每次迭代返回的結果,包含一個值和一個迭代器對象,這個迭代器對象能夠生產元素值所有等於上面那個值的組中全部對象。
先看下代碼:
class Solution: def compressString(self, S: str) -> str: from itertools import groupby return min(S, ''.join(k + str(len(list(v))) for k, v in groupby(S)), key=len)
這裏僅用 4 行代碼就可以完成任務。
在這裏 join() 括號裏面,用生成器表達式生成元素與連續相同元素個數的序列。在這裏,生成器表達式做爲參數傳入 join() 方法中,本來的括號能夠省略。
以上就是使用雙指針的方法,解決《面試題 01.06. 字符串壓縮》的問題的主要內容,其中額外說起了使用 itertools 庫的 groupby 方法來解決這個問題的方案。
歡迎關注微信公衆號《書所集錄》