javascript - 无法解决此字符串压缩问题

标签 javascript compression

我有一种情况需要以这种方式压缩字符串:

"AAABBBCCCDDD" => "A3B3C3D3", or
"ABBCCCDDDDEEEEE" => "A1B2C3D4E5", or
"FOOFOO" => "F1O2F1O2", this one is the one I can't solve

我正在用 JavaScript 来做这件事,到目前为止我已经想出了这个:

function in_array(key, array) {
    for(var x in array) {
        if(array[x] == key) {
            return true;
        }
    }

    return false;
}

function compress(str) {
    var str_splitted = str.split('');
    var new_strings = [];

    for(var x in str_splitted) {
        if(!in_array(str_splitted[x], new_strings)) {
            new_strings.push( str_splitted[x] );
            new_strings.push( (str.split(str_splitted[x]).length - 1) );
        }
    }

    return new_strings.join('');
}

因此,使用我的代码片段,两个示例将完美运行,但第三个示例仍会计算所有匹配的字符,因此输出为:

"FOOFOO" => "F2O3", and not "F1O2F1O2"

我真的需要帮助、提示、建议和/或更好的解决方案来解决这个问题,我感谢所有帮助我的人!

最佳答案

循环遍历字符串并与前一个字符进行比较:

function compress(str) {
    var last = null, cnt = 0, result = '';
    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (last != c) {
            if (last != null) {
                result += last + cnt;
            }
            last = c;
            cnt = 0;
        }
        cnt++;
    }
    if (cnt > 0) {
        result += last + cnt;
    }
    return result;
}

演示:http://jsfiddle.net/pjb5F/

注意:使用方括号按索引访问字符串在旧版本的 IE 中不起作用,因此请使用 charAt

关于javascript - 无法解决此字符串压缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17037930/

相关文章:

java - 是否有任何java压缩实用程序

javascript - Gzipped javascript 无法在 Ubuntu/Centos 上的 Firefox 上运行

JavaScript 数组操作删除奇数数组元素

javascript - Sencha touch 2- Ext.dispatch 替代品?

javascript - jQuery 灯箱插件/画廊问题

python - 在python中解压.xls文件

javascript - 将 VBA 转换为 JavaScript 自定义函数,得到不同的答案

javascript - 仅使用 CSS 的 div fadeIn 和 fadeOut(从 DOM 追加和删除)。是否可以?

java - 哪种格式的compress适合hadoop中的大图输出?

xml - 是否有用于Delphi的“快速信息集” XML压缩库?