字符串
class Solution {
public:
string licenseKeyFormatting(string s, int k) {
int c=0;
string lack="";
for(int i=s.length()-1;i>=0;i--){
if(s[i]!='-'){
if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-32;
lack+=s[i];
}
}
string ns="";
for(int i=0;i=0;i--){
// ns+=lack[i];
// c++;
// nct++;
// if(c==lack.length()%k&&i==lack.length()-c&&nct
参考后https://leetcode-cn.com/problems/license-key-formatting/solution/mi-yao-ge-shi-hua-by-leetcode-solution-xnae/改进
首先我们取出所有不为破折号的字符,题目要求对取出的字符进行重新分组,使得每个分组恰好包含 k 个字符,且必须满足第一个分组包含的字符个数必须小于等于 k,但至少要包含 1个字符。设已经取出的字符的总数为 n,只需满足第一个分组包含的字符数目刚好等于n mod k,剩余的分组包含的字符数目刚好等于 k。
我们可以从字符串 s 的末尾开始往前取出字符构建新的字符串 ans。每次取出字符时首先判断该字符是否为破折号,如果为破折号则跳过;否则将当前的字符计数 cnt 加 1,同时检查如果当前字符为小写字母则将其转化为大写字母,将当前字符加入到字符串 ans 的末尾。
对字符进行计数时,每隔 kk 个字符就在字符串 ans 中添加一个破折号。特殊情况需要处理,字符串 ans 的最后一个字符为破折号则将其去掉。
我们对已经构建的字符串 ans 进行反转即为返回结果。
复杂度分析
时间复杂度:O(N),其中 N为字符串的长度。一共需要两次遍历,第一次遍历字符串求得目标字符串,第二次遍历需要将目标字符串进行反转。
空间复杂度:O(1) 或O(N),其中 N为字符串的长度。这里的空间复杂度统计的是存储返回值以外的空间。如果使用的语言可以修改字符串,那么反转前后的字符串可以存储在同一片区域,空间复杂度为 O(1);如果不可以修改,那么反转前的字符串需要额外的空间进行存储,空间复杂度为 O(N)。
c++
class Solution {
public:
string licenseKeyFormatting(string s, int k) {
int c=0;
string ans="";
for(int i=s.length()-1;i>=0;i--){
if(s[i]!='-'){
// if(s[i]>='a'&&s[i]<='z')
// s[i]=s[i]-32;
c++;
ans.push_back(toupper(s[i]));
if(c==k){
c=0;
ans.push_back('-');
}
}
}
//if(ans.length()>0&&ans[ans.length()-1]=='-')
if(ans.length()>0&&ans.back()=='-')
ans.pop_back();
reverse(ans.begin(),ans.end());
return ans;
}
};```
java
```java
class Solution {
public String licenseKeyFormatting(String s, int k) {
StringBuilder ans=new StringBuilder();
int ct=0;
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i)!='-'){
ct++;
ans.append(Character.toUpperCase(s.charAt(i)));
if(ct==k){
ct=0;
ans.append('-');
}
}
}
if(ans.length()>0&&ans.charAt(ans.length()-1)=='-')
ans.deleteCharAt(ans.length()-1);
return ans.reverse().toString();
}
}



