Find length of smallest window that contains all the characters of a string in another string

前端 未结 8 1525
不思量自难忘°
不思量自难忘° 2020-12-24 09:05

Recently i have been interviewed. I didn\'t do well cause i got stuck at the following question

suppose a sequence is given : A D C B D A B C D A C D and search seq

8条回答
  •  我在风中等你
    2020-12-24 09:44

    I modified my previous suggestion using a single queue, now I believe this algorithm runs with O(N*m) time:

    FindSequence(char[] sequenceList)
    {
        queue startSeqQueue;
        int i = 0, k;
        int minSequenceLength = sequenceList.length + 1;
        int startIdx = -1, endIdx = -1;
    
        for (i = 0; i < sequenceList.length - 2; i++)
        {
            if (sequenceList[i] == 'A')
            {
                startSeqQueue.queue(i);
            }
        }
    
        while (startSeqQueue!=null)
        {
            i = startSeqQueue.enqueue();
            k = i + 1;
    
            while (sequenceList.length < k && sequenceList[k] != 'C')
                if (sequenceList[i] == 'A') i = startSeqQueue.enqueue();
                k++;
    
            while (sequenceList.length < k && sequenceList[k] != 'D')
                k++;
    
            if (k < sequenceList.length && k > minSequenceLength > k - i + 1)
            {
                startIdx = i;
                endIdx = j;
                minSequenceLength = k - i + 1;
            }
        }
    
        return startIdx & endIdx
    }
    

    My previous (O(1) memory) suggestion:

    FindSequence(char[] sequenceList)
    {
        int i = 0, k;
        int minSequenceLength = sequenceList.length + 1;
        int startIdx = -1, endIdx = -1;
    
        for (i = 0; i < sequenceList.length - 2; i++)
            if (sequenceList[i] == 'A')
                k = i+1;
                while (sequenceList.length < k && sequenceList[k] != 'C')
                    k++;
                while (sequenceList.length < k && sequenceList[k] != 'D')
                    k++;
    
                if (k < sequenceList.length && k > minSequenceLength > k - i + 1)
                {
                    startIdx = i;
                    endIdx = j;
                    minSequenceLength = k - i + 1;
                }
    
        return startIdx & endIdx;
    }
    

提交回复
热议问题