我正在尝试编写代码,用于搜索另一个字符串(大海捞针)中第一次出现的字符串(针)并返回匹配字符串中第一个字符的索引。
我在网上找到了以下解决方案,但我无法理解它是如何工作的。有人可以向我解释它的功能吗?
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;
}
}
}
答案 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;
}
}
}
}
首先,让我们建立一些事情:
for(int i = 0 ; ; i++)
递增i
,而for循环不会导致循环停止。用一个例子解决这个问题最容易。让我们使用名为“hip”的针和名为“chips”的干草堆。由于Java索引从0开始,我们希望该方法将返回1(表示第二个字符),因为这是“筹码”中“hip”的第一个字符。
i = 0
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
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。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。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。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(),在这种情况下,搜索将没有字母寄存器。