【问题标题】:Function that gives minimum strokes required for a given array of strings给出给定字符串数组所需的最小笔划的函数
【发布时间】:2020-02-02 17:37:04
【问题描述】:

给定一个字符串数组。字符串具有相同的长度。假设输入数组是 (["ababc", "abbba", "aaabb", "bcccb", "acbbb", "aaabb"])。

a b a b c
a b b b a
a a a b b
b c c c b
a c b b b
a a a b b

问题是关于找到最小连接的字母组,可以为同一个字母垂直和水平绘制草图,但不能对角线。对于此示例,字母“a”有 4 个组(两个单组,两个多组), 2组字母“b”(一个单,一个多)和2组字母“c”(一个单,一个多)。所以,输出应该是“8”。我找不到使用 JavaScript 的解决方案。

我尝试将其视为单独的行和列。此外,为每个字符创建数组并单独分析。但它们都不能正常工作。

function strokesRequired(picture){
        let total = picture.join('');
        let strLength = picture[0].length;
        let counter = 0;
        for(let i = 0; i < total.length; i++){
          if(total[i] !== total[i+1] || total[i] !== total[i+strLength] || total[i] !== total[i-1] || total[i] !== total[i-strLength]){
            continue;
         }
         else {        
            counter++;
          }      
        }
        return counter;    
      }

我的代码针对这个问题返回 4,但应该返回 8。因为我只计算字母没有任何水平和垂直匹配。

【问题讨论】:

  • 这闻起来像作业
  • 你的例子中的笔画是什么?为什么应该是 8 而不是 4?
  • 你的输出应该是8
  • 为了清楚起见,我已经编辑了这个问题。我希望我能以正确的方式问它
  • “问题在于找到所需的最少图纸,可以垂直和水平地绘制相同字母的草图,但不能绘制对角线。”还是不清楚。这个测试用例的输出 8 怎么样。 ?

标签: javascript algorithm


【解决方案1】:

这是一种对每个未访问过的单元格进行深度优先搜索的方法。我认为这也可以通过洪水填充来解决,当显示连接时合并组件标签。

function f(M){
  let m = M.length
  let n = M[0].length
  let visited = new Array(m)
  for (let i=0; i<m; i++)
    visited[i] = new Array(n).fill(0)
    
  function getNeighbours(y, x){
    let c = M[y][x]
    let neighbours = []

    if (y > 0 && !visited[y-1][x] && M[y-1][x] == c)
      neighbours.push([y-1, x])
    if (y < m - 1 && !visited[y+1][x] && M[y+1][x] == c)
      neighbours.push([y+1, x])
    if (x > 0 && !visited[y][x-1] && M[y][x-1] == c)
      neighbours.push([y, x-1])
    if (x < n - 1 && !visited[y][x+1] && M[y][x+1] == c)
      neighbours.push([y, x+1])

    return neighbours
  }
    
  function dfs(y, x){
    let stack = [[y, x]]
  
    while (stack.length){
      let [y, x] = stack.pop()
      visited[y][x] = 1
      stack.push(...getNeighbours(y, x))
    }
  }
  
  let count = 0
  
  for (let i=0; i<m; i++){
    for (let j=0; j<n; j++){
      if (!visited[i][j]){
        count++
        dfs(i, j)
      }
    }
  }
  
  return count
}

var M = [
  "ababc",
  "abbba",
  "aaabb",
  "bcccb",
  "acbbb",
  "aaabb"
]

console.log(f(M))

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多