Find First non-repeating character in a string


StringViews 2160

In the given stream of characters(string), find the first non-repeating character.

Example

Input string : ababcef

Output : c

Time complexity : O(1)

Algorithm

Here we use doubly linked list, The DLL contains all non-repeating character in order.

1. Create an empty DLL, array inDLL[] and repeated[] of size of asci values.

2. inDLL[] contains pointers of DLL nodes.inDLL[x] has pointer of x, else NULL.

3. Repeated[] array has bool values, repeated[x] is true if x is repeated two or more times, else false.

4. Initialize inDLL[] with NULL values and repeated[x] is false.

5. The head of DLL is first non-repeating character.

6. For every new character x,

   a) If repeated[x] is true, ignore this character.

b) If repeated[x] is false and inDLL[x] is Null Append x to DLL and store new DLL node in inDLL[x].

c) If repeadted[x] is false and inDLL[x] is not Null, get DLL node of x using inDLL[x] and remove the node. mark inDLL[x] as Null and repeated[x] as true.

C++ Program

#include <bits/stdc++.h>

#define ASCII_VALUES 256
using namespace std;
 
// A linked list DLLNode
struct DLLNode
{
    char data;
    struct DLLNode *next, *prev;
};
//function to insert node at beginning of DLL
void insertAtbeginning(struct DLLNode **head_ref, struct DLLNode **tail_ref,char x)
{
    struct DLLNode *temp = new DLLNode;
    temp->data = x;
    temp->prev = temp->next = NULL;
    if (*head_ref == NULL)
    {
        *head_ref = *tail_ref = temp;
        return;
    }
    (*tail_ref)->next = temp;
    temp->prev = *tail_ref;
    *tail_ref = temp;
}
 
//Function to remove node
void DeleteNode(struct DLLNode **head_ref, struct DLLNode **tail_ref,struct DLLNode *temp)
{
    if (*head_ref == NULL)
    {
        return;
    }
    if (*head_ref == temp)
    {
        *head_ref = (*head_ref)->next;
    }
    if(*tail_ref == temp)
    {
        *tail_ref = (*tail_ref)->prev;
    }
    if (temp->next != NULL)
    {
        temp->next->prev = temp->prev;
    }
    if (temp->prev != NULL)
    {
        temp->prev->next = temp->next;
    }
    delete(temp);
}
 
void FindFirst()
{
    struct DLLNode *inDLL[ASCII_VALUES];
    bool repeated[ASCII_VALUES];
    // Initialize the above two arrays
    struct DLLNode *head = NULL, *tail = NULL;
    for (int i = 0; i < ASCII_VALUES; i++)
    {
        inDLL[i] = NULL;
        repeated[i] = false;
    }
    //Traverse for all charcters
    char string[] = "ababcef";
    for (int i = 0; string[i]; i++)
    {
        char x = string[i];
        cout<<"Reading charcter "<<x<<" from string \n";
        //If charchter occurred less than twice.
        if (!repeated[x])
        {
            if (inDLL[x] == NULL)//If it  is not in DLL add it in beginning
            {
                insertAtbeginning(&head, &tail, string[i]);
                inDLL[x] = tail;
            }
            else//If its already there remove this character from DLL
            {
                DeleteNode(&head, &tail, inDLL[x]);
                inDLL[x] = NULL;
                repeated[x] = true; // Also mark it as repeated
            }
        }
        if (head != NULL)//Current first non-repating character (head)
        {
            cout<<"First non-repeating character till now: "<<head->data<<endl;
        }
    }
}
 
//Main function
int main()
{
    FindFirst();
    return 0;
}

Try It

 

Translate »