實現 strStr()
題目描述:實現 strStr() 函式。
給你兩個字串 haystack 和 needle ,請你在 haystack 字串中找出 needle 字串出現的第一個位置(下標從 0 開始)。如果不存在,則返回 -1 。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:窮舉法
- 首先,如果needle為空,直接返回0;如果 haystack 為空 或者 haystack 的長度 小於 needle 的長度,直接返回-1;
- 否則,從 haystack 的第一位開始跟 needle 進行匹配,如果匹配不上,則往後繼續遍歷haystack,直到遍歷完成,就能得到結果。
說明:該方法效率比較差。
解法二:KMP演算法
首先,構造一個next陣列,先計算出下一次跳轉的位置,然後遍歷按照next陣列的位置將原串和匹配串進行匹配。
import com.google.common.base.Strings;
public class LeetCode_028 {
/**
* 窮舉法
*
* @param haystack
* @param needle
* @return
*/
public static int strStr(String haystack, String needle) {
if (needle == null || needle.length() == 0) {
return 0;
}
if (haystack == null || haystack.length() == 0 || haystack.length() < needle.length()) {
return -1;
}
int first = 0;
while (first < haystack.length()) {
int matchCount = 0;
for (int i = 0; i < needle.length() && (i + first) < haystack.length(); i++) {
if (needle.charAt(i) == haystack.charAt(i + first)) {
matchCount++;
} else {
break;
}
}
if (matchCount == needle.length()) {
return first;
} else {
first++;
}
}
return -1;
}
/**
* KMP演算法
*
* @param haystack 原串
* @param needle 匹配串
* @return
*/
public static int strStr2(String haystack, String needle) {
if (Strings.isNullOrEmpty(needle)) {
return 0;
}
// 分別獲取原串和匹配串的長度
int haystackLength = haystack.length(), needleLength = needle.length();
// 原串和匹配串前面都加一個空格,使其下標從1開始
haystack = " " + haystack;
needle = " " + needle;
char[] haystackList = haystack.toCharArray();
char[] needleList = needle.toCharArray();
// 構建 next 陣列,陣列長度為匹配串的長度(next 陣列是和匹配串相關的)
int[] next = new int[needleLength + 1];
// 構造過程 i = 2, j = 0 開始,i 小於等於匹配串長度【構造 i 從 2 開始】
for (int i = 2, j = 0; i <= needleLength; i++) {
// 匹配不成功的話,j = next[j]
while (j > 0 && needleList[i] != needleList[j + 1]) {
j = next[j];
}
// 匹配成功的話,先讓 j++
if (needleList[i] == needleList[j + 1]) {
j++;
}
// 更新 next[i],結束本次迴圈, i++
next[i] = j;
}
// 匹配過程,i = 1, j = 0 開始,i 小於等於原串長度【匹配 i 從 1 開始】
for (int i = 1, j = 0; i <= haystackLength; i++) {
// 匹配不成功 j = next[j]
while (j > 0 && haystackList[i] != needleList[j + 1]) {
j = next[j];
}
// 匹配成功的話,先讓 j++,結束本次迴圈後 i++
if (haystackList[i] == needleList[j + 1]) {
j++;
}
// 整一段都匹配成功,直接返回下標
if (j == needleLength) {
return i - needleLength;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(strStr("mississippi", "issi"));
System.out.println(strStr2("mississippi", "issi"));
}
}
【每日寄語】 在最美的年華,做最喜歡的事情,別辜負了美好時光,借時光之手,暖一處花開,借一方晴空,擁抱夢想。