- Published on
Shuffle String.
Problem of the day - Shuffle String
Tag - Easy
Given a string s
and an integer array indices
of the same length.
The string s
will be shuffled such that the character at the ith
position moves to indices[i]
in the shuffled string.
Return the shuffled string.
At first glance, problem seems pretty short and simple. I just declared a new string and by iterating over the given indices array, I updated the values in the string to get the final output, as per the logic.
class Solution {public: string restoreString(string s, vector<int>& indices) { string res = s; for(int i=0;i<indices.size();i++) { res[indices[i]] = s[i]; } return res; }};
A pretty easy solution with O(n) time and space. But the bad part is run time is 15ms (faster then only 18%). It's time to improve the solution.
I am not able re-call any other method to solve this. Umm, let's head over to leetcode discussion tab.
A really good solution with O(n) time and O(1) space helped me cracked this.
So, the solution is to update the string in-place. (similar logic to cyclic sorting).
So, the idea is to iterate over the indices
array from start to end and for each element, keep on swapping it with the value index till we find the correct index value.
For example, we have [2,0,1]
. Here, at index 0
we have 2
. At index 2
we have 1
. So, we update it in-place (the string s
too along with this).
Now, array is [1,0,2]
. Still at index 0
, we don't have 0
. So we update it again which makes it [0,1,2]
. Rest of the elements are already at right place. Yay! we are done.
Code -
class Solution {public: string restoreString(string s, vector<int>& indices) { for(int i=0;i<indices.size();i++) { while(i != indices[i]) { swap(s[i], s[indices[i]]); swap(indices[i], indices[indices[i]]); } cout << s << endl; } return s; }};
Perfect, now, no extra space. What a feeling. Sigh.
You might like previous editions of my coding diary -