對於一個給定的 source 字符串和一個 target 字符串,你應該在 source 字符串中找出 target 字符串出現的第一個位置(從0開始)。如果不存在,則返回 -1
。
在線評測地址:LintCode 領扣
說明
在面試中我是否需要實現KMP算法?
- 不需要,當這種問題出現在面試中時,面試官很可能只是想要測試一下你的基礎應用能力。當然你需要先跟面試官確認清楚要怎么實現這個題。
- 《九章算法班》中講過比KMP更簡單的算法:Rabin-karp 算法,可免費試聽。
樣例 1:
輸入: source = "source" , target = "target"
輸出:-1
樣例解釋: 如果source里沒有包含target的內容,返回-1
樣例 2:
輸入: source = "abcdabcdefg" ,target = "bcd"
輸出: 1
樣例解釋: 如果source里包含target的內容,返回target在source里第一次出現的位置
【題解】
算法:模擬
算法思路
因為本題的時間復雜度比較寬限,不需要更為復雜的KMP算法,可以直接模擬,逐一比對每個字符。
代碼思路
- 先進行特判,若target長度為0,則返回0;若target的長度大於source,則表示不可能匹配,返回-1
- 枚舉匹配source的起始位置,從0到sourceLen-targetLen
- 對於一個起始位置,比對之后的targetLen位是否相同,若遇到不相同直接退出判斷,嘗試下一個起始位置
- 當成功比對完targetLen位后,說明全部相同,則返回起始位置
復雜度分析
M表示 source 的長度
N表示 target 的長度
空間復雜度:O(M+N)
時間復雜度:O(MN)
public class Solution { /** * @param source: * @param target: * @return: return the index */ public int strStr(String source, String target) { //獲取兩個字符串的長度 int sourceLen = source.length(); int targetLen = target.length(); //注意特判,若target長度為0則答案為0 if(targetLen == 0){ return 0; } //若target長度大於source,則不可能匹配 if(targetLen > sourceLen){ return -1; } for(int i = 0; i < sourceLen-targetLen+1; i++){ //k表示比對時source中所指向的字符 int k = i; for(int j = 0; j < targetLen; j++){ if(source.charAt(k) == target.charAt(j)){ //最后一個字符匹配完成,輸出答案 if(j == targetLen - 1){ return i; } k++; } //其中一個字符無法匹配,直接退出做下一次循環 else{ break; } } } return -1;
更多題解參見:九章算法