javascript - 通过用字母对替换所有出现的单词来创建新单词
问题描述
我试图编写一个循环遍历字符串并将一个字母的所有出现替换为另一个字母并创建所有可能组合的新单词的函数。应该相互替换的字母是一对。像 s 和 z 或 v 和 f 并且是硬编码的。组合应该双向工作,eisam -> zam
和zed -> sed
集合中单词的顺序并不重要。对于对[s,z]
和[v,f]
单词stuffs
应该生成
ztuffs, ztuvfs, ztuvfz, ztuffz, stuvvs, stuvvz, stuffz, stufvz
。(我认为这就是所有可能的组合,但我可能错过了一些)
我无法让它工作,感觉就像我错过了一些东西,也许这个函数应该以某种方式递归?或者有什么我想念的?
第一个函数我通过添加组合数组尝试了更动态的方法,后者只是 if 语句进行检查。
这只会替换集合中第一个出现的字母,而不是相反
console.log(replaceSimilarCharacters('stuffs')); // `[ 'stuffs', 'ztuffz', 'stuvvs' ]`
const replaceSimilarCharacters = (word) => {
let letterCombination = [
['s', 'z'],
['f', 'v']
];
const set = new Set();
set.add(word); // original word
for (let i = 0; i < word.length; i++) {
letterCombination.forEach((letterCombo) => {
letterCombo.forEach((letter) => {
if (word[i] === letter) {
const currentIndex = letterCombo.indexOf(letter);
const nextIndex = (currentIndex + 1) % letterCombo.length;
const nextLetter = letterCombo[nextIndex];
const prevLetter = letterCombo[nextIndex - 1];
const regex = new RegExp(letter, 'g');
word = word.replace(regex, nextLetter);
set.add(word);
word = word.replace(regex, prevLetter);
set.add(word);
}
});
});
}
return Array.from(set);
};
这工作得更好,但仍然缺少一些组合
console.log(replaceLettersInWord('stuffs')); // `[ 'stuffs', 'ztuffs', 'stuvfs', 'stufvs', 'stuffz' ]`
const replaceLettersInWord = (word) => {
const set = new Set();
set.add(word);
for (let i = 0; i < word.length; i++) {
const currentLetter = word[i];
if (currentLetter === 'z') {
set.add(setCharAt(word, i, 's'));
}
if (currentLetter === 's') {
set.add(setCharAt(word, i, 'z'));
}
if (currentLetter === 'f') {
set.add(setCharAt(word, i, 'v'));
}
if (currentLetter === 'v') {
set.add(setCharAt(word, i, 'f'));
}
}
return Array.from(set);
};
const setCharAt = (str, index, chr) => {
if (index > str.length - 1) return str;
return str.substring(0, index) + chr + str.substring(index + 1);
};
解决方案
推荐阅读
- c# - 我可以在 Office365 中使用 WordInterop 功能吗?
- java - 使用流添加持续时间的数组列表
- regex - 正则表达式正斜杠分隔符
- python - 如何使用原始数据中的 id 导出 k-means 算法的输出(集群标签)
- java - 资源已关闭,但 sonarlint 仍显示资源未关闭
- scala - Scala:在函数接口中使用泛型
- angularjs - 在不刷新屏幕的情况下在 UI 中反映 API 的实时更新
- reactjs - 如何每次点击更新计数器状态?
- laravel - laravel 6.0 中多对多的雄辩问题
- php - 使用变体和图像 Shopify API PHP 添加产品