28. Implement strStr()[E]實現strStr()

題目


Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
  Input:haystack = "hello", neddle = "ll"
  Output:2
Example 2:
  Input: haystack = "aaaaa", needle = "bba"
  Output: -1
Clarification:
What should we return when needle is an empty string? This is a great question to ask during an interview.
For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().python

思路


(1)題意

給定一個haystack字符串和一個needle字符串,須要咱們作的是在haystack字符串中找出needle字符串出現的第一個位置(從0開始),若是不存在返回-1。此外,若是needle字符串爲空,返回0。函數

(2)如何在在haystack字符串中找出needle字符串?

咱們想到將needle字符串視爲haystack字符串的一個子串,利用substr(pos, n)函數返回haystack字符串中從pos到pos+n位置的字符串,檢驗返回的字符串與needle是否一致,若是一致則返回pos,不然返回-1。這裏的pos應該是needle字符串第一個字符在haysatck字符串中的位置,n應該是needle字符串的長度。優化

(3)注意

這裏咱們要注意的是遍歷次數(循環次數),由於是在haystack字符串中找needle字符串,那麼循環次數必定不會超過haystack.size() - needle.size(),超過這個次數,說明needle確定不存在。this

Tips


string(C++)

(1)empty

語法:bool empty()
若是字符串爲空,返回true;不然返回false。code

(2)substr

語法:basic_string substr(size_type index, size_type num = npos)
substr返回字符串的一個子串,從index開始,到index+num結束,子串長度爲num。若是沒有指定num,則默認值是string::npos,這樣substr()返回從index開始的剩餘字符串。ip

C++

class Solution {
public:
    int strStr(string haystack, string needle) {
              
        //先考慮特殊狀況
        
        //特殊狀況1:needle字符爲空
        if(needle.empty())
            return 0;
        //特殊狀況2:needle字符長度大於haystack字符長度或者haystack字符長度爲0
        if(needle.size() > haystack.size() || haystack.empty() )
            return -1;
                
        for(int i=0;i<haystack.size() - needle.size() + 1;i++){
            
            if(haystack[i] == needle[0] && haystack.substr(i, needle.size()) == needle )
                return i;
                
        }
        
        return -1;
    }
};

Python

總結

  • 代碼要儘量精簡
  • 寫一個程序時首先要考慮特殊狀況
  • 要考慮可否對循環次數做優化以提升程序效率
相關文章
相關標籤/搜索