Algorithm
Problem Name: 831. Masking Personal Information
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:
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:
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:
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".
Constraints:
s
is either a valid email or a phone number.- If
s
is an email:8 <= s.length <= 40
s
consists of uppercase and lowercase English letters and exactly one'@'
symbol and'.'
symbol.
- If
s
is a phone number:10 <= s.length <= 20
s
consists of digits, spaces, and the symbols'('
,')'
,'-'
, and'+'
.
Code Examples
#1 Code Example with Java Programming
Code -
Java Programming
class Solution {
public String maskPII(String s) {
return s.indexOf('@') != -1 ? maskEmail(s) : maskPhoneNumber(s);
}
private String maskPhoneNumber(String phoneNumber) {
StringBuilder digits = new StringBuilder();
for (char c : phoneNumber.toCharArray()) {
if (Character.isDigit(c)) {
digits.append(c);
}
}
return getMaskedAreaCode(digits.length()) + "***-***-" + digits.substring(digits.length() - 4);
}
private String getMaskedAreaCode(int phoneNumberLength) {
return switch (phoneNumberLength) {
case 10 -> "";
case 11 -> "+*-";
case 12 -> "+**-";
case 13 -> "+***-";
default -> null;
};
}
private String maskEmail(String email) {
String[] split = email.split("@");
String name = split[0];
String domain = split[1].toLowerCase();
String maskedName = Character.toLowerCase(name.charAt(0)) + String.join("", Collections.nCopies(5, "*"))
+ Character.toLowerCase(name.charAt(name.length() - 1));
return maskedName + "@" + domain;
}
}
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with Python Programming
Code -
Python Programming
class Solution:
def maskPII(self, S):
if "@" in S:
s = S.lower().split("@")
return s[0][0] + "*" * 5 + s[0][-1] + "@" + s[1]
else:
nums, tmp = {"0","1","2","3","4","5","6","7","8","9"}, ""
for c in S:
if c in nums: tmp += c
return "+" + "*" * (len(tmp) - 10) + "-***-***-" + tmp[-4:] if len(tmp) > 10 else "***-***-" + tmp[-4:]
Copy The Code &
Try With Live Editor
Input
Output