【问题标题】:Given a list of subsrings and a string, print out the item in the list if it is a substring给定一个子环列表和一个字符串,如果它是一个子字符串,则打印出列表中的项目
【发布时间】:2013-11-04 12:54:24
【问题描述】:

给定一个子环列表和一个字符串,如果它是一个子字符串,则打印出列表中的项目。

不使用任何子字符串方法的最有效方法是什么?

示例:

输入:["cat", "dog", "foo", "foopoo", "foopo", "nope", "dogf"]

输出:"catdogfoopoo"

说明:

“c”在地图中的索引 0 处。

遍历“cat”的长度,比较从0到“cat”的长度是否相同

如果是,打印。

我的想法:

到目前为止,我的想法是循环遍历给定的字符串并将每个字符映射到索引数组列表

然后循环遍历子字符串列表。

for (int x = 0; x < list.length; x++) {
    String s = list.get(x);
    if (s.get(s.charAt(0)) != null)
         //loop through, comparing from whether the word is in the string

但这并没有利用这样一个事实,即如果“foo”已经被发现是一个子字符串,那么应该很容易检查“foopoo”是否是一个子字符串(没有循环通过 foo)

我有点卡在那里,因为我确信有一种更有效的方法可以做到这一点。不使用“包含”或诸如此类的东西(这不是更有效)

【问题讨论】:

  • 您能否更明确地说明您的示例实际上是如何获得输出的?
  • @Dukeling 见上文 :)
  • 如果您不允许使用包含,请提及它。错误指定的问题,否决票。
  • 我将cardogfoopoo 更改为catdogfoopoo,我认为r 只是打字错误。
  • 你问的问题不是微不足道的。当您将“最有效”的限制放在此处时,您会提出一大堆问题:最有效的时间或空间(内存)或代码行数?平均而言,最坏的情况,最好的情况?例如平均而言,排序可以为您提供更好的时间,但不会比不对所有实际输入进行排序更好,然后您可能已经创建了一个巨大的代码维护噩梦,它没有提供任何真正的好处。祝你好运。

标签: java string algorithm


【解决方案1】:
 for(int i=0; i < array.length; i++){
   if(input.contains(array[i])){
       System.out.println(array[i]);
   }
 }

【讨论】:

  • 不使用 .contains 。寻找算法
  • 你没有说“不使用包含”。如果您无法正确定义问题范围,请不要惩罚试图帮助您的人。
  • 当某人为您的原始问题提供解决方案时,绝不会投反对票。不是 MadConans 的错,你没有很好地说明你的问题。
  • 我的错,假设是你。
  • 虽然我不确定使用“contains”会更有效——“contains”在 java 中是如何工作的?
【解决方案2】:

这应该是涵盖此问题的解决方案。

String text = "cardogfoopoo";
for (int x = 0; x < list.length; x++) {
    if(text.containts(list[x])
         System.out.println(list[x] + " is a substring!");
}

【讨论】:

    【解决方案3】:

    也许你应该对子字符串进行排序,并生成一个类似这样的数据结构(它是一个链表数组):

    [0] cat
    [1] dog -> f
    [2] foo -> po -> o
    [3] nope
    

    在这个结构中,您可以找到子字符串“dog”和“dogf”,以及“foo”、“foopo”和“foopoo”。这类似于在字典中搜索。

    您从“catdogfoopoo”字符串的索引 0 开始,并开始在字典中搜索,即查找以“c”开头的条目。您发现结构的索引 0 包含“c”,因此您决定遍历它的长度。所以你取条目长度(3 个字符),看看从索引 0 开始的三个字符是否等于它(这是一个字符串比较,没办法)。它们是,因此您打印“cat”,因为您找到了包含在字符串中的整个条目。

    下一个索引是 3,即字符 'd',并且您位于字典位置 [0] 的第一个条目。此位置没有其他条目,因此您必须查找以“d”开头的不同条目,以便您找到“dog”作为位置 [1] 的第一个条目。将此条目(由三个字符组成)与字符串中从索引 4 开始的字符进行比较,发现它们相等,因此打印“dog”。下一个索引是 6,你比较下一个条目是“f”,你发现它们是相等的,所以你打印“dogf”。

    以此类推,直到您打印“foo”、“foopo”和“foopoo”。

    希望很清楚。如果您觉得它有用,我可以提供有关我如何创建结构的详细信息。

    【讨论】:

    • 你是如何产生这个的/它背后的逻辑是什么?
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多