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

x
+
cmd
s = "LeetCode@LeetCode.com"

Output

x
+
cmd
"l*****e@leetcode.com"

#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

x
+
cmd
s = "LeetCode@LeetCode.com"

Output

x
+
cmd
"l*****e@leetcode.com"
Advertisements

Demonstration


Previous
#830 Leetcode Positions of Large Groups Solution in C, C++, Java, JavaScript, Python, C# Leetcode
Next
#832 Leetcode Flipping an Image Solution in C, C++, Java, JavaScript, Python, C# Leetcode