<p>Given two strings <code>needle</code> and <code>haystack</code>, return the index of the first occurrence of <code>needle</code> in <code>haystack</code>, or <code>-1</code> if <code>needle</code> is not part of <code>haystack</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> haystack = &quot;sadbutsad&quot;, needle = &quot;sad&quot;
<strong>Output:</strong> 0
<strong>Explanation:</strong> &quot;sad&quot; occurs at index 0 and 6.
The first occurrence is at index 0, so we return 0.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> haystack = &quot;leetcode&quot;, needle = &quot;leeto&quot;
<strong>Output:</strong> -1
<strong>Explanation:</strong> &quot;leeto&quot; did not occur in &quot;leetcode&quot;, so we return -1.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= haystack.length, needle.length &lt;= 10<sup>4</sup></code></li>
	<li><code>haystack</code> and <code>needle</code> consist of only lowercase English characters.</li>
</ul>

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        hlen = len(haystack)
        nlen = len(needle)
        first_index_found = -1
        needle_idx = 0
        haystack_idx = 0
        found_needle_in_haystack = False
        found_first_letter_match = False
        found_complete_match = False
        while ( haystack_idx < hlen and found_needle_in_haystack == False ):
            print (f"nidx is {needle_idx} and hidx is {haystack_idx} and {needle[needle_idx]} == {haystack[haystack_idx]} and index found is {first_index_found}")
            if needle[needle_idx] == haystack[haystack_idx]:
                print (f"found match at idx {needle_idx}")
                if found_first_letter_match == False:
                    found_first_letter_match = True
                    first_index_found = haystack_idx
                    if needle_idx == ( nlen - 1 ):
                        print (f"found complete match")
                        found_complete_match = True
                        break
                    needle_idx += 1
                    haystack_idx += 1
                else:
                    if needle_idx == ( nlen - 1 ):
                        print (f"found complete match")
                        found_complete_match = True
                        break
                    else:
                        needle_idx += 1
                        haystack_idx += 1
            else:
                if found_first_letter_match == True:
                    # reset haystack back
                    haystack_idx = first_index_found + 1
                else:
                    haystack_idx += 1
                needle_idx = 0
                first_index_found = -1
                found_first_letter_match = False
        
        if not found_complete_match:
            first_index_found = -1
        return first_index_found
16500