Алгоритм решения этой задачи может быть следующим: заведем два множества. В первое множество будем помещать символы текста. Во второе множество символ будет помещен тогда и только тогда, когда его нет в первом множестве (символ встретился первый раз). Но символ может встретиться второй раз (он уже есть в первом множестве). Тогда удалим этот символ из второго множества. Таким образом, второе множество будет содержать символы, входящие в заданный текст только по одному разу.

    Приведем текст программы:

Program Problem49_2;
Var   
    M1,M2:Set Of Char;
    S:String;
    i:Byte;
Begin
  WriteLn('Задайте текст:');
  ReadLn(S);
  M1:=[]; {Начальные значения множеств.}
  M2:=[];
  For i:=1 To Length(S) Do
    If S[i] in M1 Then {Символ есть в 1-м множестве?}
     Begin
      If S[i] in M2 Then {Символ есть во 2-м множестве?}
         M2:=M2-[S[i]] {Удаляем символ из 2-го множества.}
     End
    Else {Символа нет в 1-м множестве.}
     Begin {Он встретился впервые.}
      M1:=M1+[S[i]]; {Помещаем его во}
      M2:=M2+[S[i]]; {множества.}
     End;
  WriteLn('Символы, входящие в текст один раз:');
  If M2=[] Then WriteLn('Таких символов нет')
  Else
    For i:=1 To Length(S) Do
       If S[i] in M2 Then Write(A[i],' ');
  WriteLn;
End.
Текст этой программы можно взять здесь.