了解如何在另一个字符串

时间:2016-06-24 20:16:03

标签: java string-search

我正在尝试编写代码,用于搜索另一个字符串(大海捞针)中第一次出现的字符串(针)并返回匹配字符串中第一个字符的索引。

我在网上找到了以下解决方案,但我无法理解它是如何工作的。有人可以向我解释它的功能吗?

private static int strStr(String needle, String haystack)
{
    for (int i=0;;i++) {  //
        for (int j=0;;j++) {
            if (j== needle.length()) return i;
            if (i + j == haystack.length()) return -1;
            System.out.println("needle.charAt(j) "+j+" "+needle.charAt(j));
            System.out.println("haystack.charAt(i+j) "+(i+j)+" "+haystack.charAt(i+j));
            if (needle.charAt(j) != haystack.charAt(i + j)) break;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

private static int strStr(String needle, String haystack)
{
    for (int i = 0 ; ; i++)
    {
        for (int j = 0 ; ; j++)
        {
            if (j == needle.length())
            {
                return i;
            }

            if (i + j == haystack.length())
            {
                return -1;
            }

            System.out.println("needle.charAt(j) " + j + " " + needle.charAt(j));
            System.out.println("haystack.charAt(i+j) " + (i + j) + " " + haystack.charAt(i+j));

            if (needle.charAt(j) != haystack.charAt(i + j))
            {
                break;
            }
        }
    }
}

首先,让我们建立一些事情:

  • Java将索引从0开始,因此needle.charAt(0)是字符串中的第一个字符。 needle.charAt(3)是字符串中的第四个字符。
  • 每次迭代,行for(int i = 0 ; ; i++)递增i,而for循环不会导致循环停止。

用一个例子解决这个问题最容易。让我们使用名为“hip”的针和名为“chips”的干草堆。由于Java索引从0开始,我们希望该方法将返回1(表示第二个字符),因为这是“筹码”中“hip”的第一个字符。

  • 当我们输入方法时,我们会经历第一个for循环。 i = 0
  • 下一行将我们带入另一个for循环。 i = 0, j = 0
  • j = 0不等于needle.length() = 3
  • i + j = 0 + 0 = 0不等于haystack.length() = 5
  • needle.charAt(j = 0)为“h”,haystack.charAt(i + j = 0 + 0 = 0)为“c”。由于“h”不等于“c”,我们打破了j-for-loop。 break关键字只会突破当前循环,所以当我们停止执行j for循环时,我们仍然在i-for-loop中。
  • 我们开始下一次迭代。 i = 1
  • j for循环重新开始于0. i = 1, j = 0
  • j = 0不等于needle.length() = 3
  • i + j = 1 + 0 = 1不等于haystack.length() = 5
  • needle.charAt(j = 0)为“h”,haystack.charAt(i + j = 1 + 0 = 1)为“h”。由于它们是相同的,我们不会突破j-for-loop。
  • 我们开始j for循环的下一次迭代。 i = 1, j = 1
  • j = 1不等于needle.length() = 3
  • i + j = 1 + 1 = 2不等于haystack.length() = 5
  • needle.charAt(j = 1)是“我”,haystack.charAt(i + j = 1 + 1 = 2)是“我”。由于它们是相同的,我们不会突破j-for-loop。
  • 我们开始j for循环的下一次迭代。 i = 1, j = 2
  • j = 2不等于needle.length() = 3
  • i + j = 1 + 2 = 3不等于haystack.length() = 5
  • needle.charAt(j = 2)为“p”,haystack.charAt(i + j = 1 + 2)为“p”。由于它们是相同的,我们不会突破j-for-loop。
  • 我们开始j for循环的下一次迭代。 i = 1, j = 3
  • j = 3 等于needle.length() = 3,因此我们返回i = 1

正如我们所预料的那样,我们从这个函数中得到了1,因为“hip”包含在从第1位开始的“筹码”中(零索引)。

这一切都很好,但那i + j == haystack.length()行呢?

让我们用“ben”作为针,“熊”作为大海捞针(我们应该回到-1,因为“ben”不会出现在“bear”这个词中)。

         /- needle.length()
         |   /- haystack.length()
         |   |   /- needle.charAt(j)
         |   |   |   /- haystack.charAt(i + j)
         |   |   |   |
 i | j |n.l|h.l|n.c|h.c| result
---+---+---+---+---+---+------------------
 0 | 0 | 3 | 4 | b | b | continue
 0 | 1 | 3 | 4 | e | e | continue
 0 | 2 | 3 | 4 | n | a | break j
 1 | 0 | 3 | 4 | b | e | break j
 2 | 0 | 3 | 4 | b | a | break j
 3 | 0 | 3 | 4 | b | r | break j
 4 | 0 | 3 | 4 |   |   | i + j == haystack.length(), return -1

答案 1 :(得分:0)

你可以使用contains()或indexOf()。 例如:

String str1 = "This is string of words";
String str2 = "string";
int pos = str1.indexOf(str2);
在pos中的

将int与位置。您也可以添加toUpperCase(),在这种情况下,搜索将没有字母寄存器。