如何从字符串中收集所有可能的连续单词序列?

抒情的邪恶

例如,如果空格是分隔符,

var str = "ab cde fgh ij klmn opq";

我想得到

var result = [
["ab", "cde", "fgh", "ij", "klmn", "opq"],
["ab", "cde", "fgh", "ij", "klmn opq"],
["ab", "cde", "fgh", "ij klmn opq"],
//...
["ab", "cde", "fgh ij", "klmn opq"],
["ab", "cde", "fgh ij klmn", "opq"],
//...
["ab cde", "fgh", "ij", "klmn", "opq"],
["ab cde", "fgh", "ij", "klmn opq"],
//...
["ab cde", "fgh ij", "klmn opq"],
["ab cde", "fgh ij klmn", "opq"],
//...
["ab cde fgh ij klmn", "opq"]
];

解决此类问题的有效方法是什么?

我自己的尝试仅解决了部分问题:

  1. 删除"ab",然后得到"ab" + ["cde", "fgh", "ij", "klmn", "opq"], ["cde", "fgh", "ij", "klmn opq"]...
  2. 删除"ab cde",然后得到"ab cde" + ["fgh", "ij", "klmn", "opq"], ["fgh", "ij", "klmn opq"]...

...等等。但是这种方法不允许收集所有可能的序列(如上例所示)。

灵魂

您可以递归地构建序列。只需将第一个单词加入到其余序列的每个序列构建中,或将其附加为新单词。尽管此解决方案的调用堆栈溢出存在一些问题。

但是您可以看到基本思想。

const str = 'ab cde fgh ij';

function getAllSequences(words) {
  if (words.length === 1) {
    return [words];
  }
  
  const [first, ...rest] = words;
  const sequences = getAllSequences(rest);
  
  return sequences.reduce((sequences, sequence) => {
    const withFirstConnected = [].concat(first + ' ' + sequence[0], sequence.slice(1));
    const withFirstUnshift = [].concat(first, sequence);
    
    return sequences.concat([withFirstConnected], [withFirstUnshift]);
  }, []);
}

console.log(getAllSequences(str.split(' ')));

另一个没有递归的版本,类似的方法,但是添加了最后一个单词而不是第一个单词。

function getAllSequences(words) {
  return words.reduce(addWordToSequences, [[]]);
}

function addWordToSequences(sequences, word) {
  return sequences.reduce((sequences, sequence) => {
    if (sequence.length === 0) {
      return [[word]];
    }
    
    const last = sequence[sequence.length - 1];
    const front = sequence.slice(0, sequence.length - 1);
    const withWordJoined = front.concat(last + ' ' + word);

    return sequences.concat([withWordJoined], [sequence.concat(word)]);
  }, []);
}

console.log(getAllSequences('something mdd ala ba'.split(' ')))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从字符串数组中收集所有可能的连续字符串并置?

在给定的字符串中打印所有可能的短语(单词的连续组合)

生成字符串的所有可能的连续单词组合

如何在Python中获取字符串的所有连续子字符串?

如何获取我的JavaScript数组的所有子字符串(连续的子序列)?

查找句子中单词序列的连续重复

正则表达式:字符串必须包含单词序列

如何匹配字符串中的所有字符并收集多个组?

如何有效地删除字符串中连续的重复单词或短语

查找字符串中所有可能的序列

从python中的子序列中获取所有可能的字符串

从字符串中删除所有非单词字符

如何从目标字符串中的源字符串中找到任何单词,并在PHP中从目标字符串中删除所有匹配的单词

删除字符串中的所有连续模式

如何在Python中查找所有不连续的子字符串?

如何有效地定位句子中的特定单词序列

如何从iOS中的输入字符串中搜索所有单词?

如何在Eclipse的字符串数组中的所有单词中添加(“”)?

排列所有字符串中的单词

从字符串中删除所有出现的单词

如何在连续的行中查找相同的字符串,然后打印连续包含它们的所有行

如何替换字符串中除一个以外的所有单词

如何修剪字符串中给定长度以上的所有单词?

如何使用python计算字符串中单词的所有出现次数

如何删除字符串变量(Stata)中除某些单词之外的所有内容?

如何摆脱字符串中的所有“工作日单词”

如何使用mysql php选择与字符串中某些单词匹配的所有记录

如何在javascript中删除一个单词后的所有字符串?

如何从字符串中删除单词后的所有文本?