我设法编写了一个简单的函数,该函数接受输入字符串,并将每个字符与包含变音符号(重音符号)和非变音符号的字典对象进行比较,然后尝试为每个排列创建一个新的字符串。

但是,它只是半功能的。就目前而言,当我输入字符串“ hello world”时,输出为:

["hèllo world", "héllo world", "hêllo world", "hëllo world", "hēllo world",
"hėllo world", "hęllo world", "hellô world", "hellö world", "hellò world",
"helló world", "hellō world", "hellõ world", "hello wôrld", "hello wörld",
"hello wòrld", "hello wórld", "hello wōrld", "hello wõrld"]


或者如果我输入“某些字符串”,则输出为:

["śome string", "šome string", "sôme string", "söme string", "sòme string",
"sóme string", "sōme string", "sõme string", "somè string", "somé string",
"somê string", "somë string", "somē string", "somė string", "somę string",
"some śtring", "some štring", "some strîng", "some strïng", "some stríng",
"some strīng", "some strįng", "some strìng", "some striñg", "some strińg"]


但是,它要做的只是遍历每个字符并替换一次值,然后移至下一个字符。

如何针对这些数组项中的每一个再次进行迭代以找到它们的每种可能组合?而不是移动到下一个字符并将那些字符与原始输入字符串放在后面。我需要它具有所有排列。

我整夜都在努力解决这个问题,尽管我取得了一些进步,但我仍然坚持。我试图创建一个从自身内部调用自身的递归函数,但这使我的浏览器崩溃了。

任何帮助都将是惊人的:)

这是我编写的代码:

function jig(inputStr) {
  const accents = {
    a: ["à", "á", "â", "ä", "ã", "å", "ā"],
    c: ["ç", "ć", "č"],
    e: ["è", "é", "ê", "ë", "ē", "ė", "ę"],
    i: ["î", "ï", "í", "ī", "į", "ì"],
    n: ["ñ", "ń"],
    o: ["ô", "ö", "ò", "ó", "ō", "õ"],
    s: ["ś", "š"],
    u: ["û", "ü", "ù", "ú", "ū"],
    y: ["ÿ"],
    z: ["ž", "ź", "ż"]
  };

  function hasAccents(char) {
    return /[aceinosuyz]/.test(char);
  }

  var results = [];

  for (var i = 0; i < inputStr.length; i++) {
    var currentChar = inputStr.substr(i, 1);
    // console.log(currentChar);
    if (hasAccents(currentChar)) {
      // console.log(accents[currentChar]);

      for (var y = 0; y < accents[currentChar].length; y++) {
        var tempArray = inputStr.split("");

        tempArray[i] = accents[currentChar][y];
        results.push(tempArray.join(""));
        //jig(tempArray.join(""));
      }
    }
  }

  return results;
}

最佳答案

这是一个构建每个字符串的方法。当遇到重音符号的候选字符时,我们将字符串的每个版本推入堆栈,直到该字符为止。

JavaScript代码:



function f(s){
  const accents = {
    a: ["à", "á", "â", "ä", "ã", "å", "ā"],
    c: ["ç", "ć", "č"],
    e: ["è", "é", "ê", "ë", "ē", "ė", "ę"],
    i: ["î", "ï", "í", "ī", "į", "ì"],
    n: ["ñ", "ń"],
    o: ["ô", "ö", "ò", "ó", "ō", "õ"],
    s: ["ś", "š"],
    u: ["û", "ü", "ù", "ú", "ū"],
    y: ["ÿ"],
    z: ["ž", "ź", "ż"]
  };

  var result = [];

  var stack = [['', 0]];

  while (stack.length){
    let [str, i] = stack.pop();

    if (i == s.length){
      result.push(str);
      continue;
    }

    if (accents[s[i]]){
      for (let j=0; j<accents[s[i]].length; j++)
        stack.push([str + accents[s[i]][j], i + 1]);
    }

    stack.push([str + s[i], i + 1]);
  }

  return result;
}

console.log(f('hello'));

关于javascript - 尝试使用JavaScript中的变音符号来实现递归置换功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50443213/

10-11 07:32