首页 > 解决方案 > 通过用字母对替换所有出现的单词来创建新单词

问题描述

我试图编写一个循环遍历字符串并将一个字母的所有出现替换为另一个字母并创建所有可能组合的新单词的函数。应该相互替换的字母是一对。像 s 和 z 或 v 和 f 并且是硬编码的。组合应该双向工作,eisam -> zamzed -> 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);
};

标签: javascript

解决方案


推荐阅读