javascript - 尝试使用 JavaScript 中的变音符号使递归排列起作用

标签 javascript recursion permutation substr backtracking

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

然而,它只是半功能性的。当我输入字符串“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/

相关文章:

r - 在 R 中构建特定的值组合;改变一个变量保持所有其他变量不变

JavaScript 将事件绑定(bind)到按钮数组

javascript - 如何旋转以中心为中心的文本旋转到数字

algorithm - 此事件选择递归分解中有多少个子问题?

c++ - 为什么预减会引起奇怪的变化?

c# - 具有 n 个列表的笛卡尔积

Java:数组的可能组合

javascript - 将分钟转换为小时 (H :mm) in MomentJS

javascript - jquery- 选择器来解析特定单选按钮或复选框的所有元素

recursion - 从 F# 列表中删除