https://leetcode.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/ from Google
Thinking process:
Basically no good idea for this, but since a and b consist only lowercase letters, we can just solve this with a brute force approach.
So the idea is very simple. For the first condition: Every letter in a is strictly less than every letter in b in the alphabet, we can set a boundary that given a letter x, every letter in a is smaller than x, and every letter in b is equal to or greater than x. This can be easily checked by iterating through a and b once.
Same thing can be applied to condition 2 and 3. To check all the boundary, we just need to check from a to z, which takes O(26*N) time.
Here is the code.
1class Solution {
2public:
3 int minCharacters(string a, string b) {
4 int ans = a.size() + b.size();
5 for (char t='b'; t<='z'; t++) {
6 int cur = 0;
7 for (auto c : a) if (c >= t) cur++;
8 for (auto c : b) if (c < t) cur++;
9 ans = min(ans, cur);
10 }
11 for (char t='b'; t<='z'; t++) {
12 int cur = 0;
13 for (auto c : a) if (c < t) cur++;
14 for (auto c : b) if (c >= t) cur++;
15 ans = min(ans, cur);
16 }
17 for (char t='a'; t<='z'; t++) {
18 int cur = 0;
19 for (auto c : a) if (c != t) cur++;
20 for (auto c : b) if (c != t) cur++;
21 ans = min(ans, cur);
22 }
23 return ans;
24 }
25};