在数组

时间:2017-05-18 01:41:29

标签: javascript algorithm

我可以找到列表的元素是否按顺序排列在其他列表中(如here所述),但是我遇到了一些“杂乱”数据的问题。

例如:

var source = ['the', 'dog', 'therefore', 'he', 'gets', 'a', 'treat'];
var search = ['there', 'fore', 'gets', 'treat']

这种查询数据有两种方式“混乱”。首先,一些搜索词已被分开('there', 'fore')。其次,省略了一些字符('he', 'a')。

如何在源列表中查找“杂乱”搜索列表成员的起始和结束索引? (在上面的示例中,我想要回复[2,6],其对应于therefore列表中的treat @ 2和source @ 6。

Your problem is underspecified.
What's the result for source = ['a', 'aa', 'a', 'b', 'a']], 
search = ['a', 'a']? Is it [0, 4] or [0, 2] or [1, 1] or ...? 
You could e.g. ask for the first, longest matching 'messy' subsequence. – le_m 

好点和好问题。我只需要在搜索source时跳过单个元素,并且想要返回第一个匹配(并且可以扩展函数以在搜索中包含起始索引)。

1 个答案:

答案 0 :(得分:1)

要做出一些假设:

search中的值是唯一的,因此没有['treat', 'treat']

source中的值也是唯一的。

就效率/效率而言,我无法真正帮助你。我希望这能让你了解如何开始。

var source = ['the', 'dog', 'therefore', 'he', 'gets', 'a', 'treat'];
var search = ['there', 'fore', 'gets', 'treat'];


let start, finish;
start = finish = -1;

for (let word of search)
{
  for (let i in source)
  {
    if (source[i].indexOf(word) !== -1)
    {
      if (start === -1)
      {
        start = finish = i;
      }
      else if (i > finish)
      {
        finish = i;
      }
      else if (i < start)
      {
        start = i;
      }
      break;
    }
  }
}

console.log(start, finish);