Sunday, June 15, 2014

Leetcode (Python): Implement strStr()

Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.

Solution:

We first preprocess the needle, in such a way that we obtain the equivalent states, for instance:
   a a b a a b c
   0 0 1 0 1 2 3
That means that if we are have found aabaab, we have also found aab. When we process the haystack, when we arrive to a state that we cannot go on, we change to its previous equivalent state.

class Solution:
    # @param haystack, a string
    # @param needle, a string
    # @return a string or None
    def strStr(self, haystack, needle):
        if len(needle)==0:
            return haystack
        equivalentState=[0]
        previousState = 0;
        for i in range(1,len(needle)):
            equivalentState.append(previousState)
            if needle[previousState] == needle [i]:
                previousState += 1
            else:
                previousState = 0
        position = 0
        state = 0
        while position < len(haystack):
            if haystack[position] == needle[state]:
                position += 1
                state += 1
                if state == len(needle):
                    return haystack[position-state:]
            else:
                if state == 0:
                    position +=1
                else:
                    state = equivalentState[state]
        return None

1 comment :

  1. class Solution:
    # @param haystack : string
    # @param needle : string
    # @return an integer
    def strStr(self, haystack, needle):
    if not haystack and not needle:
    return -1
    if len(haystack) == 1:
    if needle == haystack:
    return 0
    return -1
    start = 0
    needle_length = len(needle) - 1
    end = (len(haystack) - 1) - (needle_length)
    while start <= end:
    if needle == haystack[start:start + needle_length + 1]:
    return start
    start += 1
    return -1

    ReplyDelete