Wednesday, May 15, 2013

First non duplicate character in string C++

Find out the first non duplicate character in a string.
eg: "nasa" output: 'n' 

Require to scan the string only once.

思路:要求只能扫一遍string,既然时间严格限制,那只好多用空间了。一个map用来计数,一个double linkedlist用来存character candidates.最后总时间是O(n).
注:本代码未测试,懒得自己写double linked node的定义了。。

  1. //assume that s is nonempty  
  2. char firstnondup(string s){  
  3.   
  4.    unordered_map<char, ListNode*>  visited;  
  5.   
  6.    ListNode *tail = new ListNode(s[0]);  
  7.   
  8.    ListNode dummy(0);  
  9.   
  10.    dummy.next = tail;  
  11.   
  12.    tail->prev = dummy;  
  13.   
  14.    visited[s[0]] = tail;  
  15.   
  16.    for(int i = 1; i < s.length(); i++){  
  17.    
  18.       //if first occured  
  19.       if(visited.find(s[i]) == visited.end()){  
  20.   
  21.         ListNode *cur = new ListNode(s[i]);  
  22.   
  23.         visited[s[i]] = cur;  
  24.   
  25.         tail->next = cur;  
  26.   
  27.         cur->prev = tail;  
  28.   
  29.         tail = cur;  
  30.   
  31.       }  
  32.   
  33.      else{  
  34.   
  35.        //if second occured, delete node  
  36.        if(visited[s[i]] != NULL) {  
  37.   
  38.             ListNode *tmp = visited[s[i]]->prev;  
  39.   
  40.             tmp->next = visited[s[i]]->next;  
  41.   
  42.             visited[s[i]]->next->prev = tmp;  
  43.   
  44.             if(visited[s[i]] == tail) tail = tmp;  
  45.   
  46.             delete visited[s[i]];  
  47.       }  
  48.   
  49.       //if more than secondly occured, just continue  
  50.     }  
  51.   }  
  52.   
  53. return dummy.next.val;  
  54.   
  55. }  
  56.   
  57.    

No comments:

Post a Comment