使用JavaScript获取所有可能的字符串组合

问题描述 投票:2回答:1

目前,我正在尝试获取给定字符串的所有组合,同时保持所有内容的顺序。基本上,我想通过允许混合的假名/汉字答案来生成一个测验的替代答案列表,具体来说是日语。我遇到的障碍是根据给定的字符串和备用值生成所有可能的假名/汉字组合的数组。

'{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります'中的花括号决定了我想用'げつようび|すいようび|きんようび|にほんご'中的替代值替换的文本。但是,这些值仅应替换其各自的汉字,或更简单地说,是其索引。

我对下面要实现的目标有一个总体了解。但是,它不会返回所有可能性,甚至不会创建某些重复项。老实说,我想我可能对此考虑过头,让自己头疼。

感谢您的帮助。

function getCombos (str, alt) {
  var a = str.match(/(\{.*?\})/g),
      b = alt.split('|'),
      c = [], s,

      i = 0, j = a.length, k;

  for (; i < j; i++) {
    s = str.replace(a[i], b[i]);
    c.push(s.replace(/\{|\}/g, ''));

    for (k = 0; k < j; k++) {
      if (k != i) {
        s = s.replace(a[k], b[k]);
        c.push(s.replace(/\{|\}/g, ''));
      }
    }
  }

  return c;
};


console.log(getCombos('{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります', 'げつようび|すいようび|きんようび|にほんご'));
javascript string permutation
1个回答
0
投票

睡在上面并清醒我的头,这是我想出的解决方案。这有点骇人听闻,但似乎涵盖了几乎所有可能的组合。如果有人有更好的解决方案,或者想对我提出的方案有所改进,我欢迎您提供任何答复。

感谢您的帮助。

function getCombos (str, alt) {
  var a = str.match(/(\{.*?\})/g),
      b = alt.split('|'),
      c = [],
      len = a.length,
      i = 0, j, k, l, m,
      S1, S2, S3, S4, S5,
      cleaned;

  for (; i < len; i++) {
    // strings to be used for various combos
    S5 = S4 = S3 = S2 = S1 = str.replace(a[i], b[i]);
    c.push(S1.replace(/\{|\}/g, ''));

    // variables for looping in multiple directions
    j = 0;
    k = len;
    l = Math.floor(len / 2);
    m = Math.ceil(len / 2);

    while (j < len || k > -1 || l < len || m > -1) {
      // fill left --> right
      if (j < len) {
        if (j != i) {
          S2 = S2.replace(a[j], b[j]);
          cleaned = S2.replace(/\{|\}/g, '');

          if (c.indexOf(cleaned) == -1) {
            c.push(cleaned);
          }
        }

        j++;
      }

      // fill right --> left
      if (k > -1) {
        if (k != i) {
          S3 = S3.replace(a[k], b[k]);
          cleaned = S3.replace(/\{|\}/g, '');

          if (c.indexOf(cleaned) == -1) {
            c.push(cleaned);
          }
        }

        k--;
      }

      // fill middle --> right
      if (l < len) {
        if (l != i) {
          S4 = S4.replace(a[l], b[l]);
          cleaned = S4.replace(/\{|\}/g, '');

          if (c.indexOf(cleaned) == -1) {
            c.push(cleaned);
          }
        }

        l++;
      }

      // fill middle --> left
      if (m > -1) {
        if (m != i) {
          S5 = S5.replace(a[m], b[m]);
          cleaned = S5.replace(/\{|\}/g, '');

          if (c.indexOf(cleaned) == -1) {
            c.push(cleaned);
          }
        }

        m--;
      }
    }
  }

  return c;
};


console.log(getCombos('{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります', 'げつようび|すいようび|きんようび|にほんご'));
© www.soinside.com 2019 - 2024. All rights reserved.