JavaScript中限制重复字符出现次数为一次


问题

我们需要编写一个JavaScript函数,该函数只接收一个字符串str作为参数。

该函数应根据输入字符串准备一个新的字符串,其中每个字符只保留一个出现,保留的字符是使结果字符串按字典顺序最小的字符。

例如,如果函数的输入是:

const str = 'cbacdcbc';

那么输出应该是:

const output = 'acdb';

输出解释

请注意,我们可以从字符串中删除任何“c”的出现,但是我们删除了第一个“c”,这使得字符串按字典顺序最小,对于“a”和“b”也是如此。

示例

这段代码将是:

const str = 'cbacdcbc';
const removeDuplicates = (str = '') => {
   if (str.length <= 1) {
      return str;
   };
   let flag;
   let string = "";
   let legend = new Array(26).fill(-1 let last = "z";
   let ind = 0;
   for (let i = str.length - 1; i > -1; i--) {
      const element = str[i];
      if (legend[element.charCodeAt() - 97] < 0) {
         legend[element.charCodeAt() - 97] = i;
         last = element;
         ind = i;
         string += element;
      } else {
         if (last >= element) {
            last = element;
            ind = i;
         }
      }
   }
   let finalStr = last;
   while (string.length > finalStr.length) {
      legend.fill(-1);
      for (let i = str.length - 1; i > ind; i--) {
         const element = str[i];
         if (finalStr.indexOf(element) < 0) {
            if (legend[element.charCodeAt() - 97] < 0) {
               legend[element.charCodeAt() - 97] = i;
               last = element;
               flag = i;
            } else {
               if (last >= element) {
                  last = element;
                  flag = i;
               }
            }
         }
      }
      ind = flag;
      finalStr += last;
   }
   return finalStr;
};
console.log(removeDuplicates(str));

代码解释

这里的思路是:

首先,我们循环遍历整个字符串以检查使用了哪些字母,并找到包含所有字符的最小起始字母子字符串。

如果我们从右到左开始循环并记住子字符串的起始位置和起始最小字母,则更容易理解。

然后,我们开始循环遍历子字符串(不包括起始最小字母),仍然是从右到左,但这次我们需要忽略我们已经存储的字母。

输出

控制台中的输出将是:

acdb

更新于:2021年3月20日

浏览量 132

开启您的职业生涯

完成课程获得认证

开始学习
广告