482. License Key Formatting

Description

You are given a license key represented as a string s that consists of only alphanumeric characters and dashes. The string is separated into n + 1 groups by n dashes. You are also given an integer k.

We want to reformat the string s such that each group contains exactly k characters, except for the first group, which could be shorter than k but still must contain at least one character. Furthermore, there must be a dash inserted between two groups, and you should convert all lowercase letters to uppercase.

Return the reformatted license key.

Example 1:

Input: s = "5F3Z-2e-9-w", k = 4
Output: "5F3Z-2E9W"
Explanation: The string s has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.


Example 2:

Input: s = "2-5g-3-J", k = 2
Output: "2-5G-3J"
Explanation: The string s has been split into three parts, each part has 2 characters except the first part as it could be shorter as mentioned above.


Constraints:

• 1 <= s.length <= 105
• s consists of English letters, digits, and dashes '-'.
• 1 <= k <= 104

Solutions

• class Solution {
public String licenseKeyFormatting(String s, int k) {
s = s.replace("-", "").toUpperCase();
StringBuilder sb = new StringBuilder();
int t = 0;
int cnt = s.length() % k;
if (cnt == 0) {
cnt = k;
}
for (int i = 0; i < s.length(); ++i) {
sb.append(s.charAt(i));
++t;
if (t == cnt) {
t = 0;
cnt = k;
if (i != s.length() - 1) {
sb.append('-');
}
}
}
return sb.toString();
}
}

• class Solution {
public:
string licenseKeyFormatting(string s, int k) {
string ss = "";
for (char c : s) {
if (c == '-') continue;
if ('a' <= c && c <= 'z') c += 'A' - 'a';
ss += c;
}
int cnt = ss.size() % k;
if (cnt == 0) cnt = k;
int t = 0;
string res = "";
for (int i = 0; i < ss.size(); ++i) {
res += ss[i];
++t;
if (t == cnt) {
t = 0;
cnt = k;
if (i != ss.size() - 1) res += '-';
}
}
return res;
}
};

• class Solution:
def licenseKeyFormatting(self, s: str, k: int) -> str:
s = s.replace('-', '').upper()
res = []
cnt = (len(s) % k) or k
t = 0
for i, c in enumerate(s):
res.append(c)
t += 1
if t == cnt:
t = 0
cnt = k
if i != len(s) - 1:
res.append('-')
return ''.join(res)


• func licenseKeyFormatting(s string, k int) string {
s = strings.ReplaceAll(s, "-", "")
cnt := len(s) % k
if cnt == 0 {
cnt = k
}
t := 0
res := []byte{}
for i, c := range s {
res = append(res, byte(unicode.ToUpper(c)))
t++
if t == cnt {
t = 0
cnt = k
if i != len(s)-1 {
res = append(res, byte('-'))
}
}
}
return string(res)
}

• function licenseKeyFormatting(s: string, k: number): string {
const n = s.length;
let cnt = (n - (s.match(/-/g) || []).length) % k || k;
const ans: string[] = [];
for (let i = 0; i < n; i++) {
const c = s[i];
if (c === '-') {
continue;
}
ans.push(c.toUpperCase());
if (--cnt === 0) {
cnt = k;
if (i !== n - 1) {
ans.push('-');
}
}
}
while (ans.at(-1) === '-') {
ans.pop();
}
return ans.join('');
}