如何在javascript中使用 Map() 解决“由字符 A、C、G 和 T 组成的字符串。查找最长重复”的问题

Posted

技术标签:

【中文标题】如何在javascript中使用 Map() 解决“由字符 A、C、G 和 T 组成的字符串。查找最长重复”的问题【英文标题】:How can I solve a problem which is "a string consisting of characters A, C, G, and T. Find the longest repetition" with Map() in javascript 【发布时间】:2022-01-16 09:43:48 【问题描述】:

给你一个 DNA 序列:一个由字符 A、C、G 和 T 组成的字符串。你的任务是找出序列中最长的重复。这是一个最大长度的子字符串,只包含一种类型的字符。

我正在尝试用 javascript 中的 Map() 解决这个问题。

我的解决方案:



    let n='ATTCGGGA';
var reptition = function(n) 
let strToArr=n.split('');
for(let i=0; i<strToArr.length; i++)
 
    let map=new Map();
    map.set(strToArr[i],0);
    const iterator1 = map.values();
for (const [key, value] of map.entries()) 
    if(map.has(strToArr[i]))
     map.set(strToArr[i],iterator1.next().value+1)  
     console.log(key + ' : ' + value)
    

 


;

console.log(reptition(n));

我正在尝试循环遍历序列中的所有字符,然后在 Map() 中将其设置为作为字符的键,并将 1 作为所有字符的值。如果相同的字符重复,则其值将增加 1,最后返回最长的重复。

但我不知道该怎么做?

【问题讨论】:

@pilchard 不,我正在尝试用 Map() 解决这个问题。在上面的讨论中,使用 Map() 没有解决方案。 【参考方案1】:

这是一个更正的实施:

let n = 'ATTCGGGA';

var reptition = function (n) 
  let strToArr = n.split('');
  let map = new Map();

  let currentLetter = null;
  let currentCount = 0;
  for (let i = 0; i < strToArr.length; i++) 
    if (currentLetter === strToArr[i]) 
        currentCount++;
     else 
        currentCount = 1;
        currentLetter = strToArr[i];
    
    const previousCount = map.get(currentLetter) ?? 0;
    if (currentCount > previousCount) map.set(currentLetter, currentCount);
  
  return Array.from(map.entries()).sort((prev, next) => next[1] - prev[1])[0]; 
;

console.log(reptition(n));

您在循环的每次迭代中都重新声明 new Map()。您也可以通过一次迭代来解决这个问题 - 不确定嵌套迭代是关于什么的。

您当然可以使上述实现更高效,例如通过删除实用程序变量currentLettercurrentCount。随便玩玩吧!

【讨论】:

以上是关于如何在javascript中使用 Map() 解决“由字符 A、C、G 和 T 组成的字符串。查找最长重复”的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javascript 中的 Map 键上使用 .map()

JavaScript中 forEach map 方法 无法跳出循环问题及解决方案

如何在没有突变的情况下使用 javascript Map

如何在注册表单中添加标记和中心地图 django-map-widget

如何使用 filter()、map() 处理数组的值? JavaScript

JavaScript Map –如何使用JS.map()函数