1. Return the minimum number of swaps required to make s1 equal to s2.
2. Return the minimum number of steps to make s and t anagrams of each other.
3. Given three integers a, b, and c, return the longest possible happy string, if there are multiple such strings return any of them. if there is no such string, return empty string.
## What are greedy algorithms?
- Greedy algorithms follow this format:
- identify what choices you have at every step
- find the best choice
- just do what looks best until done
- assume that the best choice is the one that will lead to the best outcome
## How do we know greedy works?
- Write out a formal proof
- too complicated to write out
- too much time
- better to use intuition
- try a bunch of ideas
- find counterexamples
## Steps to use greedy algorithms
<Steps>
<Step title="Identify the different steps and choices">
- Choices have to be comparable
- must determine if a choice is better than another
</Step>
<Step title="Check if greedy works">
- try finding small cases where greedy is not optimal
- if cases pass, try to deduce why greedy is optimal
</Step>
</Steps>
## Why use greedy algorithms?
- simple to code
- doesn't use complex algorithms (BFS, DFS, etc.)
- runtime is fast, usually 0(n) or O(nlogn)
- however, greedy algorithms are not always optimal