1. 程式人生 > 實用技巧 >LeetCode 443. 壓縮字串 雙指標

LeetCode 443. 壓縮字串 雙指標

地址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;
}

};