javascript - Codewars 挑战 - 最长的元音子串

标签 javascript algorithm

是的,我正在经历一个代码 war 挑战,其目的是返回最长元音子串的长度,因为在“codewarriors”中将是“io”,所以答案是 2。我已经解决的方法它是通过用空格替换非元音字母,将剩下的元音字母拆分成一个数组,然后遍历该数组并将第一个子字符串插入另一个数组,然后我设置另一个 for 循环,这样我就可以遍历第一个数组检查第二个数组的长度,并在必要时用最长的替换。

这是我遇到麻烦的地方,因为我正在推送第一个值(与其他值进行比较的值),但是如果在第二个循环中需要替换它,我只是替换值而不是推送,所以如果第一个值是最长的数组将是一个对象,如果它需要在第二个循环中被替换,它将被替换但它会变成一个字符串,这意味着给出长度的结束 return 语句需要更改在 longest.length 和 longest[0].length 之间,我通过在末尾添加一个条件检查 typeof 来绕过它,但我想知道是否有另一种绕过它的方法?

我是初学者,所以如果以上内容有点令人困惑,请原谅我,非常欢迎任何有关解决挑战的其他方法的提示。

这是行不通的代码 -

  function longestVowel(str) {

  var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ');

  var split = seperateVowels.split(" ");

  var longest = [];
  for(var i = 0; i < split.length; i++) {
    if(longest.length === 0 && split[i] != "") {
      longest = split[i];
    }  for(var j = 0; j < longest.length; j++) {
      if(split[i].length > longest[j].length) {
        longest = split[i];
      }
     }
    }

  return longest.length;

}

这是我的工作 -

function longestVowel(str) {

  var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ');

  var split = seperateVowels.split(" ");

  var longest = [];
  for(var i = 0; i < split.length; i++) {
    if(longest.length === 0 && split[i] != "") {
      longest.push(split[i]);
    }  for(var j = 0; j < longest.length; j++) {
      if(split[i].length > longest[j].length) {
        longest = split[i];
      }
     }
    }

  if(typeof longest == "object") {
    return longest[0].length;
  } else {
    return longest.length;
  }

}

longestVowel("suoidea");

最佳答案

此处线性算法O(n) 背后的想法是,您实际上只需查看数组的每个元素一次。

在迭代的每一步,我们维护两个变量 globalMaxcurrentMax,它们分别保存迄今为止最长的元音子串和当前正在考虑的最长元音子串。

当遇到元音时,我们会检查从那里开始我们可以走多长时间,直到遇到非元音字符。直到它不再是元音子串为止。这将是 currentMax,我们将其与 globalMax 进行比较,以检查我们是否遇到了更长的元音子字符串。所以,globalMax 是所有 currentMax 中最好的

假设输入是'suoideaoi'

  i    |  s[i]  | currentMax  | globalMax
-------|--------|-------------|-----------
  0    |    s   |      0      |   0
  1    |    u   |      0      |   0
  2    |    o   |      1      |   1
  3    |    i   |      2      |   2
  4    |    d   |      0      |   2
  5    |    e   |      1      |   2  
  6    |    a   |      2      |   2
  7    |    o   |      3      |   3
  8    |    i   |      4      |   4 

在这里,我们计算 i = 2 到 3 的形式,因为它们是元音字母,但在 i = 3 处,我们注意到子串不再是元音子串,所以我们停在那里并将 currentMax 重置为 0。

O(n) 的原因在于,一旦我们检查了元音子字符串 s[2] 到 s[3] 即) oi 我们可以确定这个元音子串不需要在后面可能出现的任何元音子串中进一步考虑,因为在这之后有一个非元音字符因此使得任何子串包括这个子串都不是元音子串。

关于javascript - Codewars 挑战 - 最长的元音子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433064/

相关文章:

javascript - 如何在 JSP/Struts WEB-INF 中获取资源

javascript - 以 javascript 为中心的元素的问题

c++ - 计算和存储非常大数的幂

javascript - Cordova:在单击按钮之前调用 onclick 事件

javascript - 带总和的 jQuery 选择器

javascript - 检查缓存的 jquery 对象是否仍在 DOM 中

c++ - 谁能建议一种从类中创建整数键的方法?

algorithm - Dijkstra 处理一个下降沿并给出正确的解决方案,一旦给出不正确的解决方案

algorithm - 查找一组间隔的覆盖范围

algorithm - 马桶座算法