Masking Personal Information Problem
Description
LeetCode Problem 831.
You are given a personal information string s, representing either an email address or a phone number. Return the masked personal information using the below rules.
Email address: An email address is:
- A name consisting of uppercase and lowercase English letters, followed by
- The ‘@’ symbol, followed by
- The domain consisting of uppercase and lowercase English letters with a dot ‘.’ somewhere in the middle (not the first or last character). To mask an email:
- The uppercase letters in the name and domain must be converted to lowercase letters.
- The middle letters of the name (i.e., all but the first and last letters) must be replaced by 5 asterisks “*****”.
Phone number: A phone number is formatted as follows:
- The phone number contains 10-13 digits.
- The last 10 digits make up the local number.
- The remaining 0-3 digits, in the beginning, make up the country code.
- Separation characters from the set {‘+’, ‘-‘, ‘(‘, ‘)’, ‘ ‘} separate the above digits in some way.
To mask a phone number:
- Remove all separation characters.
- The masked phone number should have the form:
- ”***-***-XXXX” if the country code has 0 digits.
- ”+*-***-***-XXXX” if the country code has 1 digit.
- ”+**-***-***-XXXX” if the country code has 2 digits.
- ”+***-***-***-XXXX” if the country code has 3 digits.
- “XXXX” is the last 4 digits of the local number.
Example 1:
1
2
3
4
Input: s = "LeetCode@LeetCode.com"
Output: "l*****e@leetcode.com"
Explanation: s is an email address.
The name and domain are converted to lowercase, and the middle of the name is replaced by 5 asterisks.
Example 2:
1
2
3
4
5
Input: s = "AB@qq.com"
Output: "a*****b@qq.com"
Explanation: s is an email address.
The name and domain are converted to lowercase, and the middle of the name is replaced by 5 asterisks.
Note that even though "ab" is 2 characters, it still must have 5 asterisks in the middle.
Example 3:
1
2
3
4
5
Input: s = "1(234)567-890"
Output: "***-***-7890"
Explanation: s is a phone number.
There are 10 digits, so the local number is 10 digits and the country code is 0 digits.
Thus, the resulting masked number is "***-***-7890".
Example 4:
1
2
3
4
5
Input: s = "86-(10)12345678"
Output: "+**-***-***-5678"
Explanation: s is a phone number.
There are 12 digits, so the local number is 10 digits and the country code is 2 digits.
Thus, the resulting masked number is "+**-***-***-7890".
Constraints:
- s is either a validemail or a phone number.
- If s is an email:
- 8 <= s.length <= 40
- sconsists of uppercase and lowercase English letters and exactly one ‘@’symbol and’.’symbol.
- If s is a phone number:
- 10 <= s.length <= 20
- sconsists of digits, spaces, and the symbols’(‘,’)’,’-‘, and’+’.
Sample C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
string email(string &s, int id) {
string t = string(1, s[0] | ' ') + "*****" + string(1, s[id-1] | ' ');
for (int i = id + 1; i != s.size(); i++)
if (s[i] != '.')
s[i] |= ' ';
return t + s.substr(id, s.size());
}
string phone(string &s) {
string table[] = { "" , "+*-", "+**-", "+***-" }, t;
for(auto &ch: s)
if(ch >= '0' && ch <= '9')
t.push_back(ch);
return table[t.size() - 10] + "***-***-" + t.substr(t.size() - 4, 4);
}
string maskPII(string s) {
int id = s.find('@');
return id == -1 ? phone(s) : email(s, id);
}
};