LeetCode 443. 壓縮字串 雙指標
阿新 • • 發佈:2020-09-03
地址https://leetcode-cn.com/problems/string-compression/submissions/
給定一組字元,使用原地演算法將其壓縮。 壓縮後的長度必須始終小於或等於原陣列長度。 陣列的每個元素應該是長度為1的字元(不是 int 整數型別)。 在完成原地修改輸入陣列後,返回陣列的新長度。 進階: 你能否僅使用O(1) 空間解決問題? 示例 1: 輸入: ["a","a","b","b","c","c","c"] 輸出: 返回 6 ,輸入陣列的前 6 個字元應該是:["a","2","b","2","c","3"] 說明: "aa" 被 "a2" 替代。"bb" 被 "b2" 替代。"ccc" 被 "c3" 替代。 示例 2: 輸入: ["a"] 輸出: 返回 1 ,輸入陣列的前 1 個字元應該是:["a"] 解釋: 沒有任何字串被替代。 示例 3: 輸入: ["a","b","b","b","b","b","b","b","b","b","b","b","b"] 輸出: 返回 4 ,輸入陣列的前4個字元應該是:["a","b","1","2"]。 解釋: 由於字元 "a" 不重複,所以不會被壓縮。"bbbbbbbbbbbb" 被 “b12” 替代。 注意每個數字在陣列中都有它自己的位置。 提示: 所有字元都有一個ASCII值在[35, 126]區間內。 1 <= len(chars) <= 1000。
演算法1
使用了雙指標,測算出相同的字母和字母的個數
放入新的字串中
C++ 程式碼
class Solution { public: int compress(vector<char>& chars) { int l = 0; int r = 0; string ans; while (l < chars.size() && r < chars.size()) { if (chars[l] == chars[r]) { r++; } else { int count = r - l ; ans+= (chars[l]); if (count != 1) ans += to_string(count); l = r; } } int count = r - l; ans += (chars[l]); if(count != 1) ans += to_string(count); l = r; for(int i =0;i <ans.size();i++){ chars[i]=ans[i]; } return ans.size(); } };
演算法2
題目考慮到額外空間只有O(1)
只添加了一個當前長度的變數
然後原地修改
C++ 程式碼
class Solution { public: int compress(vector<char>& chars) { int l = 0; int r = 0; int currChar = chars[l]; int currlen = l; while (l < chars.size() && r < chars.size()) { if (chars[l] == chars[r]) r++; if (r >= chars.size() || chars[l] != chars[r]) { string count = to_string(r - l); chars[currlen] = chars[l]; currlen++; if(count != "1"){ for (int i = 0; i < count.size(); i++) { chars[currlen] = count[i]; currlen++; } } l = r; } } return currlen; } };