【发布时间】:2016-08-02 04:19:40
【问题描述】:
我只是第二学期的 CS 学生,不能使用任何众所周知的高效子字符串搜索算法。我需要使用以下方法签名来实现 indexOf 方法:
int indexOf(String str, String pattern) 返回模式作为 str 的子字符串出现的第一个位置的索引。
这是我尝试的:
首先,我创建了一个重载方法索引,其签名为 indexOf(String str, char ch, int startIndex),它返回 char 的第一个位置的索引,否则返回 -1。
private int indexOf(String str, char ch, int startIndex) {
for(int i = startIndex; i < str.length(); i++)
if(str.charAt(i) == ch) return i;
return -1;
}
现在我编写搜索子字符串 (pattern) 的方法。
private int indexOf(String str, String pattern) {
int headIndex = indexOf(str, pattern.charAt(0), 0);
int tailIndex = indexOf(str, pattern.charAt(pattern.length() - 1), 0);
if(headIndex == -1 || tailIndex == -1) return -1; // no substring match
while(true) {
int j = 0;
for(int i = headIndex; i <= tailIndex; i++)
if(str.charAt(headIndex) != pattern.charAt(j++)) { //if substring does not match then compute a new head and tail Index
headIndex = indexOf(str, pattern.charAt(0), headIndex);
tailIndex = indexOf(str, pattern.charAt(pattern.length() - 1), tailIndex);
j = 0;
i = headIndex + 1;
if(headIndex == -1 || tailIndex == -1) return -1;
break;
}
if(headIndex >= 0) return headIndex;
}
}
我相信我已经接近了,但像 indexOf("Hellolo", "lo") 这样的调用返回 2 而不是 3。我正试图找出我的逻辑哪里出了问题并需要帮助。
我不允许使用任何特殊的字符串方法,除了长度。
【问题讨论】:
-
可能是因为索引是从 0 而不是 1 开始的?
-
“不能使用任何众所周知的高效子串搜索算法”是否意味着您不能使用现有的实现,或者您必须使用未知且效率低下的算法?
-
@AndyTurner 不能使用像 Boyer-Moore 这样的现有实现
-
我认为您的逻辑有些复杂。要实现简单的
O(mn)算法,我认为您不需要(第一个)indexOf(String, char, int)方法。 -
如果您更新
headIndex和tailIndex并从现有的headIndex和tailIndex值开始调用 indexOf 辅助方法,您将得到相同的值(您在你的 for 循环中重新执行此操作)。尝试从每个索引的下一个索引开始,看看你会得到什么。
标签: java string algorithm substring indexof