aboutsummaryrefslogtreecommitdiff
path: root/challenge-074/walt-mankowski/cpp/ch-2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-074/walt-mankowski/cpp/ch-2.cpp')
-rw-r--r--challenge-074/walt-mankowski/cpp/ch-2.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/challenge-074/walt-mankowski/cpp/ch-2.cpp b/challenge-074/walt-mankowski/cpp/ch-2.cpp
new file mode 100644
index 0000000000..ab8b330e19
--- /dev/null
+++ b/challenge-074/walt-mankowski/cpp/ch-2.cpp
@@ -0,0 +1,36 @@
+#include <string>
+#include <iostream>
+#include <map>
+#include <list>
+
+using namespace std;
+
+int main(int argc, char *argv[]) {
+ const string s(argv[1]);
+ string out = string(s.length(), ' ');
+ map<char,list<char>::const_iterator> seen;
+ list<char> nr;
+
+ for (size_t i = 0; i < s.length(); i++) {
+ const char c = s[i];
+
+ // have we seen c before?
+ if (seen.find(c) == seen.end()) {
+ nr.push_front(c);
+ seen[c] = nr.cbegin();
+ } else {
+ // remove c from nr
+ if (seen[c] != nr.end()) {
+ nr.erase(seen[c]);
+ seen[c] = nr.end();
+ }
+ }
+
+ // now the FNR is either the last element of nr, or #
+ if (nr.empty())
+ out[i] = '#';
+ else
+ out[i] = *(nr.cbegin());
+ }
+ cout << out << endl;
+}