Nice article!

1. We can consider each person in the network a node in a graph with friendship relationships as edges. With a BFS approach, we insert each of person 1's friends in a Hash table. Then we check for each of person 2's friends if he is in the Hash table. If so, we have our solution.
2. Same thing as the first problem, we do a BFS of max depth 3 from person 1 and insert every node we come across into a Hash table. After that, we do a BFS from person 2 of max depth 4. If we find a node that is in the Hash table, we basically have our solution. Reconstruction is pretty straight-forward: we can keep a pointer for each of the visited nodes to the node which we came from, etc.
3. We already know that the 2 subsets we are looking for have the same sum which is equal to the sum of all the elements in the set / 2, so we only need to find the elements of 1 of the 2 subsets. A neat solution would be splitting the set into 2 random disjoint subsets of size N / 2, namely A and B. Then we insert each sum of every combination of elements from A into a hash table. We then check the sums of every combination of elements from B i. e. for a sum K, if S / 2 - K is in the hash, then we have a solution. Final complexity: O(2 ^ (N / 2 + 1)). An alternative to this solution would be a well implemented algorithm which randomly moves elements from one subset to the other. This outperforms the 2 ^ (N / 2) algorithm on memory and may even have better results on time.
6. I only know a simple algorithm for solving this...We'll consider the empty space as element 0. We'll keep every state found until the present state in a queue etc. For the present state "A" swap the element 0 with each of it's neighbours and remove "A" from the queue. For each of the new 2-4 states, check if it is already in the queue or has been "done". If not, check if it is the final configuration. If it is we have the minimal solution, else add this configuration to the queue. After checking all neighbours, mark state "A" as "done". If at some point the queue turns out to be empty, then the puzzle has no solution. I'm not sure if a technique similar to the Rubik cube solving algorithms might work here because there may be unreachable states.
7. Step 1: For each x and y, 0 <= x <= y < N, reverse the elements between x and y in string S. The resulting strings are kept in a queue. Repeat step 1, only this time we will be keeping the resulting strings in a Hash.
Step 2: For each x and y, 0 <= x <= y < N, reverse the elements between x and y in string T. Do this once more. If one of the resulting substrings is in the Hash, then that's a solution. (We'll also need to implement an algorithm similar to Rabin-Karp for quick string comparison). Final complexity: O(N^5).
Will come back later, if I figure out any of the other problems.