我设法写了一个简单的函数,它接受一个输入字符串,并将每个字符与包含与其非变音字符配对的变音(重音)字符的字典对象进行比较,然后尝试为每个排列创建一个新字符串那个。
然而,它只是半功能性的。当我输入字符串' 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;
}
答案 0 :(得分:2)
这是构建每个字符串的方法。当遇到重音的候选字符时,我们将字符串的每个版本推送到堆栈,直到该字符。
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'));