I'm doing a problem that says "concatenate the words to generate the lexicographically lowest possible string." from a competition.
Take for example this string: jibw ji jp bw jibw
The actual output turns out to be: bw jibw jibw ji jp
When I do sorting on this, I get: bw ji jibw jibw jp
.
Does this mean that this is not sorting? If it is sorting, does "lexicographic" sorting take into consideration pushing the shorter strings to the back or something?
I've been doing some reading on lexigographical order and I don't see any point or scenarios on which this is used, do you have any?
You can convert this into a trivial sorting problem by comparing word1 + word2 against word2 + word1. In Python:
Using this comparison function with the standard sort solves the problem.
//Use this block of code to print lexicographically sorted characters of an array or it can be used in many ways.
Prasun's trick works if you instead pad with a special "placeholder" character that could be weighted to be greater than "z" in a string sort function. The result would give you the order of lowest lexicographic combination.
It seems that what you're looking for is a better understanding of the question, so let me just make it clear. The usual sorting on strings is lexicographic sorting. If you sort the strings [jibw, ji, jp, bw, jibw] into lexicographic order, the sorted sequence is [bw, ji, jibw, jibw, jp], which is what you got. So your problem is not with understanding the word "lexicographic"; you already understand it correctly.
Your problem is that you're misreading the question. The question doesn't ask you to sort the strings in lexicographic order. (If it did, the answer you got by sorting would be correct.) Instead, it asks you to produce one string, got by concatenating the input strings in some order (i.e., making one string without spaces), so that the resulting single string is lexicographically minimal.
To illustrate the difference, consider the string you get by concatenating the sorted sequence, and the answer string:
Now when you compare these two strings — note that you're just comparing two 14-character strings, not two sequences of strings — you can see that the correct answer is indeed lexicographically smaller than your answer: your answer starts with "bwjij", while the correct answer starts with "bwjib", and "bwjib" comes before "bwjij" in lexicographic order.
Hope you understand the question now. It is not a sorting question at all. (That is, it is not a problem of sorting the input strings. You could do sorting on all possible strings got by permuting and concatenating the input strings; this is one way of solving the problem if the number of input strings is small.)
I've been using F# in this Facebook hacker cup. Learned quite a bit in this competition. Since the documentation on F# on the web is still rare, I think I might as well share a bit here.
This problem requests you to sort a list of strings based on a customized comparison method. Here is my code snippet in F#.
The contest is over so I am posting a possible solution, not the most efficient but one way of doing it
I am using algorithms from the STL library in c++, the prev_permutation function simply generates a permutation sorted lexicographically