題目
給你兩個字符串?haystack
?和?needle
?,請你在?haystack
?字符串中找出?needle
?字符串的第一個匹配項的下標(下標從 0 開始)。如果?needle
?不是?haystack
?的一部分,則返回??-1
?。
示例 1:
輸入:haystack = "sadbutsad", needle = "sad" 輸出:0 解釋:"sad" 在下標 0 和 6 處匹配。 第一個匹配項的下標是 0 ,所以返回 0 。
示例 2:
輸入:haystack = "leetcode", needle = "leeto" 輸出:-1 解釋:"leeto" 沒有在 "leetcode" 中出現,所以返回 -1 。
提示:
1 <= haystack.length, needle.length <= 104
haystack
?和?needle
?僅由小寫英文字符組成
思路
首先關于不同情況的分類:
1.haystack.length=needle.length:
為了能夠進入循環,
分為haystack.length=needle.length>2
和haystack.length=needle.length=1
2.haystack.length>needle.length:(這種情況兩個length都大于2)
3.haystack.length<needle.length(感覺沒有這種情況,暫時不考慮,以后改進)
綜合上面3個情況,能夠返回值不是-1 的情況有:
haystack.length=needle.length:
以及以下兩種,這兩種需要進入循環
haystack.length=needle.length>2
haystack.length>needle.length
具體思路:
定義nf=needle的第一個字符
遍歷haystack中的每一個字符,
如果遇到等于nf的字符,則從 這里開始判斷 是否有一個子串等于needle
如果有,返回i,如果沒有,返回-1
遇到等于nf的字符時,判斷 是否有一個子串等于needle,具體判斷方法:
在前面定義boolean ifEqualsNeedle = false,表示是否有等于needle的子串
使用雙指針,j指向haystack中的元素,k指向needle中的元素,
j和k的最大值判斷: j 從 i+1 開始,k從 1 開始,循環次數都是needle.length-1,
于是得到,j最大到<=i+needle.length()-1 ,
k最大到<neesle.length()
//雙指針//j表示haystack的下標,最小=i+1,最大到<=i+needle.length()-1//k表示needle的下標,最小=1,最大到<=neesle.length()-1int j = i + 1;int k = 1;while (k<needle.length()) {if (haystack.charAt(j) != needle.charAt(k))break;j++;k++;}if(k==needle.length())ifEqualsNeedle=true;else ;
代碼
public class Main {public static void main(String[] args) {System.out.println(strStr("mississippi", "issip"));}public static int strStr(String haystack, String needle) {int result = -1;//needle的第一個字符char nf = needle.charAt(0);//遍歷haystack,當某一個字符=nf時候,看后續是否都匹配//遍歷的終點 haystack.length()-needle.length(),// 因為這之后即使有“某一個字符=nf”,也不可能有等于needle的子串boolean ifEqualsNeedle = false;if (haystack.equals(needle)) {result = 0;} else {for (int i = 0; i <=haystack.length() - needle.length(); i++) {if (haystack.charAt(i) == nf) {//雙指針//j表示haystack的下標,最小=i+1,最大到<=i+needle.length()//k表示needle的下標,最小=1,最大到<neesle.length()int j = i + 1;int k = 1;while (k<needle.length()) {if (haystack.charAt(j) != needle.charAt(k))break;j++;k++;}if(k==needle.length())ifEqualsNeedle=true;else ;if (ifEqualsNeedle == true) {result = i;break;} else continue;} else ;}}return result;}
}
記錄
雖然目前沒必要追求這個,先做到能寫出來題目就行
但是還是挺開心的
?