Adapted from [research!rsc]
public class UniqueChars<T>
{
private int n;
private T dense[((unsigned long)((T)-1)) + 1];
private T sparse[((unsigned long)((T)-1)) + 1];
public UniqueChars() { clearSet(); }
public void clearSet() { n = 0; }
public void addMember(T val)
{
dense[n] = val;
sparse[val] = n++;
}
public isMember(T val)
{
const T index = sparse[val];
return index < n && dense[index] == val;
}
public void removeMember(T val)
{
if (isMember(val))
{
const T old_val = dense[--n];
const T new_index = sparse[val]
dense[new_index] = old_val;
sparse[old_val] = new_index;
}
}
};
void findUniqueChars(const unsigned char *str)
{
UniqueChars<unsigned char> s;
unsigned char c;
while (0 != (c = *str++))
{
if (! s.isMember(c))
{
s.addMember(c);
putc (c, stdout);
}
}
}

Leave a comment