[ALO]プログラマ-文字列圧縮(JavaScript、JavaScript)

13138 ワード

プログラマー-文字列圧縮
質問する
データ処理の専門家になりたい「音声器」は、文字列を圧縮する方法を学んでいる.最近,文字列に連続的に現れる同じ値を文字数と繰返し値として表すことによって,より短い文字列に減少する簡単な無損圧縮法を学習した.
例えば、「aabbacc」については、「2 a 2 ba 3 c」と表すことができ(文字が1回繰り返されていない場合は1を省略する)、このような方式の欠点は、重複文字が少ない場合に圧縮率が低いことである.たとえば、文字列「abcabcdede」は完全に圧縮されません.この欠点を解決するために、「ピッチ」は、文字列を1つ以上の単位に切り取ることで圧縮し、より短い文字列として表す方法を探します.
たとえば、「abbcddababccdcdd」は、文字を1単位に切り取ると全く圧縮されず、2単位に切り取ると「2 ab 2 cd 2 ab 2 cd」と表すことができます.異なる方法で8単位でせん断および圧縮を行う場合、「2 abbcdcd」を使用して表すことができ、これは圧縮が最も短い方法である.
別の例は「abcabcdede」であり、文字を2単位に切り取って圧縮すると「abcabc 2 de」になり、3単位に切り取ると「2 abcdede」になり、この3単位が最も短い圧縮方法になります.3つの単位を切り取り、最後に残った文字列を貼り付けます.
圧縮する文字列sをパラメータとして指定する場合は、上述した方法に従って1つ以上の単位で文字列を切り取り、solution関数を完了して、表す文字列の中で最も短い長さを返します.
文字列は、先頭から指定した長さで切り捨てなければなりません.
せいげんじょうけん
  • sの長さは1または1000以上です.
  • sには、アルファベット小文字のみが含まれています.
  • プロセス
    圧縮単位は1 ~ (전체 문자열 길이 / 2)と考えればいいです.
    に答える
    function solution(s) {
        let answer = 0;
        let left = '';
        let right = '';
        let result = [];
      
        for (let i = 1; i < Math.ceil(s.length / 2) + 1; i++) {
            result.push([]);
            // i = length
            let cnt = 1;
            for (let k = 0; k < s.length; k++) {
                left = s.substr(k * i, i);
                right = s.substr((k * i) + i, i);
                
                if (left === right) {
                    cnt += 1;
                }
                else {
                    // 똑같은 문자열이 있는 경우 숫자와 문자열을 같이 저장
                    if (cnt > 1) {
                        result[i - 1] += String(cnt) + left;
                    }
                    // 똑같은 문자열이 없는 경우 문자열만 저장
                    else {
                        result[i - 1] += left;
                    }
                    cnt = 1;
                }
            }
        }
        
        let min = result[0].length;
        for (let i in result) {
            if (min > result[i].length) {
                min = result[i].length;
            }
        }
        return min;
    }
  • 11023リロード
  • function solution(s) {
        let min_len = s.length;
        
        for (let i = 1; i <= parseInt(s.length / 2); i++) {
            let prev = s.substr(0, i);
            let cnt = 1;
            let tmp_str = '';
            
            for (let k = i; k < s.length; k += i) {
                const cur = s.substr(k, i);
                
                if (prev === cur) cnt++;
                else {
                    tmp_str += (cnt > 1 ? String(cnt) : '') + prev;
                    cnt = 1;
                    prev = cur;
                }
            }
            tmp_str += (cnt > 1 ? String(cnt) : '') + prev;
            
            min_len = Math.min(min_len, tmp_str.length)
        }
        
        return min_len;
    }