【LeetCode/LintCode】 題解丨微軟面試題:字符串查找


對於一個給定的 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算法,可以直接模擬,逐一比對每個字符。

代碼思路

  1. 先進行特判,若target長度為0,則返回0;若target的長度大於source,則表示不可能匹配,返回-1
  2. 枚舉匹配source的起始位置,從0到sourceLen-targetLen
  3. 對於一個起始位置,比對之后的targetLen位是否相同,若遇到不相同直接退出判斷,嘗試下一個起始位置
  4. 當成功比對完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; 

更多題解參見:九章算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM