深究字串壓縮系列一共兩大部分,會分別闡述原地壓縮演算法和哈夫曼演算法
本文主要內容是原地壓縮演算法。
如果有乙個字串[a,a,a,b,b,c],如果直接這樣儲存,需6個空間,但如果將其壓縮成[a,3,b,2,c]則只需要5個空間,這樣就實現了一次壓縮。而在壓縮的過程中,不再多使用別的記憶體空間,又將這種演算法稱為原地壓縮演算法。
我們假設所需壓縮的字串都是有序排序的,我們使用兩個指標 read 和 write 分別標記讀和寫的位置。讀寫操作均從左到右進行:讀入連續的一串字元,然後將壓縮版寫到陣列中。最終,write 將指向輸出答案的結尾
。保留指標 anchor,指向當前讀到連續字串的起始位置。
從左到右進行讀取。當讀到最後乙個字元,或者下乙個下乙個字元與當前不同時,則到達連續區塊的結尾。
當我們到達連續區塊的結尾時,就從 write 寫入壓縮的結果。chars[anchor] 為字元,read - anchor + 1 (若大於 1)為長度。
#include
#include
#include
"stdlib.h"
using
namespace std;
class
solution
anchor = read +1;
}}return write;}}
;void
main()
; solution.
compress
(chars)
;}
這就是相關**,由於使用的是c++,所以有一點特殊的地方想著重說明。
原地壓縮演算法本身並不難理解,但我在做的時候,被下面的**段卡住了
unsigned
int len =1;
while
((read - anchor +1)
/10>=10)
len++
;char
* a =
newchar
[len]
;_itoa_s
(read - anchor +
1, a,
(size_t)len +1,
10);for
(int i =
0; i < len; i++
) chars[write++
]= a[i]
;
這段**目的是為了獲取重複字母的數量,並將其轉化成char型別,其中_itoa_s 這個函式,卡住了我很長時間,它的定義如下:
_acrtimp errno_t __cdecl _itoa_s
( _in_ int _value,
//值_out_writes_z_
(_buffercount)
char
* _buffer,
//目的位址
_in_ size_t _buffercount,
//目的位址的空間
_in_ int _radix//進製數
);
其中第三個引數,原本我的理解是和動態宣告的陣列大小一樣,因此我填入了len,當len=1時,程式執行至此就會崩潰,最後我都沒有找到原因,在網上查了很多資料都是沒有什麼價值的內容。最後經過我的多次測試發現,只要令其大於1,程式即可正常執行。
在這裡想補充一段內容,同樣是陣列的賦值,strcpy和memcpy有何區別?
strcpy和memcpy主要有以下3方面的區別。
1.複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2.複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
3.用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy
C語言字串原地壓縮實現方法
字串原地壓縮示例 eeeeeaaaff 壓縮為 e5a3f2 具體功能 如下 copyright c 2011 alexingcool.程式設計客棧 all rights reserved.include include include using na程式設計客棧mespace std char ...
資料結構 演算法之(029)( 字串原地壓縮)
題目 字串原地壓縮,題目描寫敘述 eeeeeaaaff 壓縮為 e5a3f2 請程式設計實現 題目分析 1 原地壓縮,意思是不開闢額外的空間 2 應該考慮單個字元不壓縮,比方 q 壓縮過後還是 q 而不應該是 q1 3 壓縮後某個字元個數是多位數,演算法實現 include include incl...
原地操作 刪除或壓縮 字串 in place
看了兩道題 一道是原地壓縮字串 例如把aaabbcdddd變為a3b2cd4 另一道是,給定乙個字串s和另外乙個字串t,in place操作,刪除s中所有在t中出現過的字元 這種題目都是乙個套路,使用兩個char 的指標,fast和slow 以第二題為例 fast和slow一開始都指向初始的字串s ...