Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so this every letter appear once and only O nCE. You must make sure your result are the smallest in lexicographical order among all possible results.
Example:
Given"bcabc"
Return"abc"
Given"cbacdcbc"
Return"acdb"
https://leetcode.com/problems/maximum-product-of-word-lengths/
Test instructions is to remove the duplicate letters, leaving the letters with the smallest alphabetic order.
The first solution, greed, complexity O (n^2).
Each round counts the number of occurrences of letters, from left to right to find the smallest or only one occurrence of the letter, if the smallest letter has multiple, take the leftmost one.
1 /**2 * @param {string} s3 * @return {string}4 */5 varRemoveDuplicateLetters2 =function(s) {6 varres = "", I, pos, Countch = {}, Charcodea = ' a '. charCodeAt (0);7 while(S!== ""){8 for(i = 0; i < i++) Countch[string.fromcharcode (i + charcodea)] = 0;9 for(i = 0; i < s.length; i++) countch[s[i]]++;Tenpos = 0; One for(i = 0; i < s.length; i++){ A if(S[i] < S[pos]) pos =i; - if(Countch[s[i]] = = = 1) Break; -countch[s[i]]--; the } -Res + =S[pos]; -s = s.substring (pos + 1, s.length). Replace (NewREGEXP (S[pos], ' g '), '); - } + returnRes; -};
The second method uses a stack, the complexity of the complex O (n).
The end of the maintenance stack is the result, and the number of occurrences of all letters should be counted at the beginning.
Putting letters into an array is a greedy process, each cycle, if the letter is not in the stack, the current element is in the stack.
But before checking the letters in the stack, if the top letter of the stack is larger than the current letter and the top of the stack will appear, then the stack, because it is placed in the back of the letter order is relatively small, such as the second B in the Bab.
1 /**2 * @param {string}3 * @return {string}4 */5 varRemoveduplicateletters =function(s) {6 varI, Countch = {}, Charcodea = ' a '. charCodeAt (0), stack = [], visited ={}, top;7 for(i = 0; i < i++) Countch[string.fromcharcode (i + charcodea)] = 0;8 for(i = 0; i < s.length; i++) countch[s[i]]++;9 for(i = 0; i < s.length; i++){Tencountch[s[i]]--; One if(Visited[s[i]])Continue; Atop = Stack[stack.length-1]; - for(; stack.length > 0 && countch[top] > 0 && s[i] < top; top = Stack[stack.length-1]){ -Visited[top] =false; the Stack.pop (); - } - Stack.push (S[i]); -Visited[s[i]] =true; + } - returnStack.join (' '); +};
[Leetcode] [JavaScript] Remove Duplicate Letters