当前位置: 首页 > 面试题库 >

在一组字符串中找到最长的公共起始子字符串[关闭]

商风华
2023-03-14
问题内容

提出一个最优雅的JavaScript,Ruby或其他解决方案来解决一个相对琐碎的问题是一个挑战。

这个问题是Longest common
substring问题的
一个更具体的情况。我只需要找到数组中最长的公共
起始 子串。这大大简化了问题。

例如,最长的子字符串[interspecies, interstelar, interstate]是“ inters”。但是,我不需要在中找到“有意义”
[specifics, terrific]

我已经通过用JavaScript快速编写一个解决方案来解决该问题,这是我对类似于shell的制表符补全(此处为测试页)的回答的一部分。这是稍作调整的解决方案:

function common_substring(data) {
  var i, ch, memo, idx = 0
  do {
    memo = null
    for (i=0; i < data.length; i++) {
      ch = data[i].charAt(idx)
      if (!ch) break
      if (!memo) memo = ch
      else if (ch != memo) break
    }
  } while (i == data.length && idx < data.length && ++idx)

  return (data[0] || '').slice(0, idx)
}

此代码可在Gist中获得,并且在Ruby中可以使用类似的解决方案。您可以将要点克隆为git
repo进行尝试:

$ git clone git://gist.github.com/257891.git substring-challenge

我对这些解决方案不是很满意。我觉得可以用更多的优雅和更少的执行复杂性来解决它们,这就是我要发布此挑战的原因。

我将接受我认为最优雅或最简洁的解决方案作为答案。例如,这是我想出的一个疯狂的Ruby黑客-&在String上定义运算符:

# works with Ruby 1.8.7 and above
class String
  def &(other)
    difference = other.to_str.each_char.with_index.find { |ch, idx|
      self[idx].nil? or ch != self[idx].chr
    }
    difference ? self[0, difference.last] : self
  end
end

class Array
  def common_substring
    self.inject(nil) { |memo, str| memo.nil? ? str : memo & str }.to_s
  end
end

首选使用JavaScript或Ruby的解决方案,但是只要您解释发生了什么,您就可以展示其他语言的巧妙解决方案。请仅从标准库中获取代码。

更新:我最喜欢的解决方案

我选择了JavaScript的分拣解决方案通过肯纳贝克为“答案”,因为它让我觉得既意外和天才。如果我们不考虑实际排序的复杂性(让我们想象一下它已被语言实现无限优化),则解决方案的复杂性就是比较两个字符串。

感谢您的参与!从评论中可以看到,我学到了很多东西(甚至是关于Ruby的知识)。


问题答案:

这是一个问题,但这是一个简单的javascript版本:它对数组进行排序,然后仅查看第一个和最后一个项目。

//数组中最长的公共起始子字符串

function sharedStart(array){
    var A= array.concat().sort(), 
    a1= A[0], a2= A[A.length-1], L= a1.length, i= 0;
    while(i<L && a1.charAt(i)=== a2.charAt(i)) i++;
    return a1.substring(0, i);
}

德莫斯

sharedStart(['interspecies', 'interstelar', 'interstate'])  //=> 'inters'
sharedStart(['throne', 'throne'])                           //=> 'throne'
sharedStart(['throne', 'dungeon'])                          //=> ''
sharedStart(['cheese'])                                     //=> 'cheese'
sharedStart([])                                             //=> ''
sharedStart(['prefix', 'suffix'])                           //=> ''


 类似资料:
  • 我正在学习最长公共子序列,使用以下算法: 公共级LCS{ 但是程序返回一个ErrorCharAt(未知来源),并且没有做任何事情。 另外,如果我将int i和j更改为0,那么下面的E将是索引-1和错误 我现在很迷路。有人能帮我吗?

  • 问题内容: 我正在寻找一个Python库,用于从 一组字符串中 找到最长的公共子 字符串 。有两种方法可以解决此问题: 使用后缀树 使用动态编程。 实施的方法并不重要。重要的是,它可以用于 一组字符串 (不仅是两个字符串)。 问题答案: 这些成对的函数将在任意字符串数组中找到最长的公共字符串: 毫无疑问,该算法可以得到改进,而且我对Python的接触也很少,因此也许它在语法上也可能更有效,但是它应

  • 问题是,我试图这么做,但我检查字符串长度的方法不起作用;我能做些什么来修复它?

  • 我如何在O(N**2)个时间内完成它?

  • 问题内容: 我在尝试搜索字符串中的子字符串时遇到问题。该子字符串可能在字符串中也可能不在字符串中。 我知道是否可以完成的两种方法是: 正则表达式 但是,还有其他“优化”方式吗?你会怎么做? Ruby可以提供更好的答案吗?由于我们使用jRuby,因此答案可以是Ruby或Java。 问题答案: 在Ruby中,使用方法: 返回。

  • http://articles.leetcode.com/2011/11/lengton-palindromic-substring-part-i.html 我处理这个问题的领域是用java编写代码,使用简单的强力解决方案,然后使用o(n2)方法,没有额外的空间,就像现在这样。http://www.geeksforgeeks.org/lengte-palindromic-substring-set