Making a few assumptions: Only going to see a known and relatively small (100ish) number of unique characters at most, nothing outlandish like a string that's miles long, etc.
Track character counts using an array. Keep a queue of Pair objects that tracks characters seen only once and the index they were first seen at.
Scan the string one character at a time, starting at index 0. Increment the count for that character. If incrementing to 1, add a new pair to the queue marking where that character was first encountered. If incrementing to 2, scan the queue and remove the pair for that character.
When you're done, the first pair in the queue contains the first-encountered unrepeated character in the string. Could also track the number of repeated characters (incrementing that count when an individual character count hits 2) and terminate when all characters have been repeated.
Should work well for small possible character sets (eg alphanumeric+punctuation). Scanning the queue when removing characters won't take too long (and isn't necessary when adding since we only add once at count=1). A palindrome containing each possible character twice yields the worst performance from this part; O(n^2), but for a small character set (small n), this isn't necessarily a big deal.