Problem:
Given a list of newline-separated handles create an arrangement such that the following word begins with the same letter the prior word ended with.
Display:
Input | Output |
---|---|
4 seek red karaoke dads |
red dads seek karaoke |
2 stressed desserts |
desserts stressed |
Solution:
- Use backward recursive function
- Return true if array of string can be arranged as word chain
- Else return false
- Anchor case: Return true when input has only 1 character
- Divide array of string into 2 parts:
- Part 1: A word in array. Put this word to end of array.
- Part 2: Remaining words.
- If part 2 can be sorted into word chain and part 1 can join at the end of part 2, return true
- If the above condition are not met, move last word back into original position and try another word
Pseudo code:
bool sort(array of n words)
If n = 1
Return true
Loop through n words
Swap current word with the last word in array
Call sort(the first n-1 word in array)
If recursive function return true && current word can join with sorted array
Return true
Put current word to original position and try another word
Return false
Example:
Take a look at this example:
Input: dads seek red
Call sort([dads, seek, red])
:
- Loop 1:
- Swap: [red, seek, dads]
- Call
sort([red, seek])
:[seek, red]
: false[red, seek]
: false
- Back: [ dads, seek, red ]
- Loop 2:
- Swap: [ dads, red, seek]
- Call
sort([dads, red])
:[red, dads]
: true
- Join
[red, dads, seek]
: true
Return true
Output: red, dads, seek
Note: Source code available here. Give me ⭐ if you enjoy it!