按最长公共起始子串

时间:2015-12-10 19:21:44

标签: javascript regex algorithm substring grouping

这就是问题所在。说我有这些字符串:

  • apple ipad mini 32gb
  • apple ipad mini 64gb
  • apple ipad air 64gb
  • apple ipad air 32gb
  • panasonic gh4
  • samsung s2 galaxy
  • samsung s2 galaxy red
  • samsung s3 galaxy

我希望这些字符串分组如下:

  • apple ipad mini:[apple ipad mini 32gb,apple ipad mini 64gb]
  • apple ipad air:[苹果ipad air 64gb,苹果ipad 32gb]
  • panasonic gh4:[panasonic gh4]
  • samsung s2 galaxy:[samsung s2 galaxy,samsung s2 galaxy red]
  • samsung s3 galaxy

重点是将项目的名称与其属性(颜色,内存容量等)分开。

我使用此算法查找最长的公共子字符串: link

你们可以分享你的想法吗?无需代码或实现。谢谢。

编辑:

    this.data = _.sortBy(this.data, function(item) {
        return item.title;
    });

    var i = 0;
    var groups = {};
    var len = this.data.length - 1;
    while(i < len) {
        var key = this.lcs(this.data[i][this.attr], this.data[i+1][this.attr]) || this.data[i][this.attr];
        groups[key] = true;
        i++;
        while(this.data[i][this.attr].startsWith(key) && i < len) {
            i++;
        }
    }
    console.log(groups) 

这很好用(仅测试添加键)。但是我想添加三星s3 galaxy来列出。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

如果你只想简单地按最长公共前缀分组(这意味着即使“苹果ipad”会产生更大的组,也会选择“apple ipad mini”),那么可能是这样的吗?

sort the list
i = 0
while i < end of list:
  key = longest common prefix of list[i] & list[i + 1]
        or list[i] if the common prefix is less than (1?) words or i is the last index
  groups[key] = list[i++]
  while key is prefix of list[i]:
    add list[i++] to groups[key]

答案 1 :(得分:0)

尝试通过比较具有相同单词的两个字符串来解决问题,并查看单词的长度是否小于上一个路径。

&#13;
&#13;
function groupObject(i, l) {
    return { item: i, length: l };
}

function group(r, a, i, o) {
    var rr = r.item.split(' '),
        aa = a.split(' '),
        j = 0,
        key, keys = [];

    while (aa[j] === rr[j]) {
        keys.push(aa[j]);
        j++;
    }
    if (keys.length < r.length && i < o.length - 1) {
        return group(groupObject(o[i + 1], 0), a, Number.MAX_VALUE, o);
    }
    key = keys.join(' ');
    if (!key || keys.length < r.length && i === o.length - 1) {
        key = a;
    }
    grouped[key] = grouped[key] || [];
    grouped[key].push(a);
    return groupObject(a, keys.length);
}

var data = ['apple ipad mini 32gb', 'apple ipad mini 64gb', 'apple ipad air 64gb', 'apple ipad air 32gb', 'panasonic gh4', 'samsung s2 galaxy', 'samsung s2 galaxy red', 'samsung s3 galaxy'],
    grouped = {};

data.reduce(group, groupObject(data[1], 0));
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
&#13;
&#13;