comments | difficulty | edit_url | tags | |
---|---|---|---|---|
true |
简单 |
|
给定一个许可密钥字符串 s
,仅由字母、数字字符和破折号组成。字符串由 n
个破折号分成 n + 1
组。你也会得到一个整数 k
。
我们想要重新格式化字符串 s
,使每一组包含 k
个字符,除了第一组,它可以比 k
短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。
返回 重新格式化的许可密钥 。
示例 1:
输入:S = "5F3Z-2e-9-w", k = 4 输出:"5F3Z-2E9W" 解释:字符串 S 被分成了两个部分,每部分 4 个字符; 注意,两个额外的破折号需要删掉。
示例 2:
输入:S = "2-5g-3-J", k = 2 输出:"2-5G-3J" 解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
提示:
1 <= s.length <= 105
s
只包含字母、数字和破折号'-'
.1 <= k <= 104
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)
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;
}
};
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)
}