License Key Formatting (original) (raw)

Last Updated : 23 Jul, 2025

Given a string **S that consists of only alphanumeric characters and dashes. The string is separated into **n+1 groups by **n dashes. We are also given a number K, the task is 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, a dash must be inserted between two groups, and you should convert all lowercase letters to uppercase. Return the reformatted string.

**Examples:

**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 two extra dashes are not needed and can be removed.

**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

Try It Yourselfredirect icon

Table of Content

**[Naive Approach] Using Extra String - O(n) Time and O(n) Space

The idea is to use Greedy approach where we fill the result (from end) with k characters and the end fill the remaining characters at the beginning.

Follow the steps to solve the problem:

#include <bits/stdc++.h> using namespace std; string ReFormatString(string S, int K){ string temp; int n = S.length(); for (int i = 0; i < n; i++) { if (S[i] != '-') { temp.push_back(toupper(S[i])); } } int len = temp.length(); string ans; int val = K;

// Iterate over the string from right
// to left and start pushing
// characters at an interval of K
for (int i = len - 1; i >= 0; i--) {
    if (val == 0) {
        val = K;
        ans.push_back('-');
    }
    ans.push_back(temp[i]);
    val--;
}

// Reverse the final string and
// return it.
reverse(ans.begin(), ans.end());
return ans;

} int main(){ string s = "5F3Z-2e-9-w"; int K = 4; cout << ReFormatString(s, K); return 0; }

C

#include <ctype.h> #include <stdio.h> #include <string.h>

char* ReFormatString(char* S, int K) { / char temp[100]; int n = strlen(S); int len = 0; for (int i = 0; i < n; i++) { if (S[i] != '-') { temp[len++] = toupper(S[i]); } }

char* ans
    = (char*)malloc(sizeof(char) * (len + len / K + 1));
int val = K;
int j = 0;

// Iterate over the string from right
// to left and start pushing
// characters at an interval of K
for (int i = len - 1; i >= 0; i--) {
    if (val == 0) {
        val = K;
        ans[j++] = '-';
    }
    ans[j++] = temp[i];
    val--;
}

// Reverse the final string and
// return it.
ans[j] = '\0';
int i = 0, k = j - 1;
while (i < k) {
    char t = ans[i];
    ans[i++] = ans[k];
    ans[k--] = t;
}
return ans;

}

int main() { char s[] = "5F3Z-2e-9-w"; int K = 4; printf("%s", ReFormatString(s, K)); return 0; }

Java

class GFG { public static String ReFormatString(String S, int K) { String temp = ""; int n = S.length(); for (int i = 0; i < n; i++) { if (S.charAt(i) != '-') { temp += (Character.toUpperCase(S.charAt(i))); } } int len = temp.length();

String ans = "";
int val = K;

// Iterate over the String from right
// to left and start pushing
// characters at an interval of K
for (int i = len - 1; i >= 0; i--) {
  if (val == 0) {
    val = K;
    ans += '-';
  }
  ans += temp.charAt(i);
  val--;
}

// Reverse the final String and return it
char[] charArray = ans.toCharArray();
reverse(charArray, charArray.length);
String res = new String(charArray);
return res;

}

static void reverse(char a[], int n) { char t; for (int i = 0; i < n / 2; i++) { t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } }

public static void main(String args[]) { String s = "5F3Z-2e-9-w"; int K = 4; System.out.println(ReFormatString(s, K));

} }

Python

def ReFormatStrings(s,k):

temp = ""
n = len(s)
for i in range(0,n):
    if(s[i] != '-'):
        temp += s[i].upper()
length = len(temp)

ans = ""
val = k

# Iterate over the string from right to left 
# and start pushing characters at an interval of K
for i in range(length - 1,-1,-1):
    if(val == 0):
        val = k
        ans += '-'
    ans += temp[i]
    val -= 1

# Reverse the final string and return it.
ans = ans[::-1]
return ans

Driver code

if name == "main": s = "5F3Z-2e-9-w" k = 4 print(ReFormatStrings(s,k))

C#

using System;

public class GFG{

public static string ReFormatString(string S, int K) {

string temp="";
int n = S.Length;
for (int i = 0; i < n; i++) {
  if (S[i] != '-') {
    temp+=(char.ToUpper(S[i]));
  }
}
int len = temp.Length;


string ans="";
int val = K;

// Iterate over the string from right
// to left and start pushing
// characters at an interval of K
for (int i = len - 1; i >= 0; i--) {
  if (val == 0) {
    val = K;
    ans+='-';
  }
  ans+=temp[i];
  val--;
}

// Reverse the final string and
// return it.
char[] charArray = ans.ToCharArray();
Array.Reverse( charArray );
string res = new string(charArray);  
return res;

}

static public void Main (){ string s = "5F3Z-2e-9-w"; int K = 4; Console.WriteLine(ReFormatString(s, K));

} }

JavaScript

function reverse(s) { let splitString = s.split(""); let reverseArray = splitString.reverse(); let joinArray = reverseArray.join(""); return joinArray; }

function ReFormatString(S,K) { let temp = ""; let n = S.length; for (let i = 0; i < n; i++) { if (S[i] != '-') { temp+=S[i].toUpperCase(); } } let len = temp.length;

let ans = "";
let val = K;

// Iterate over the let from right
// to left and start pushing
// characters at an interval of K
for (let i = len - 1; i >= 0; i--) {
    if (val == 0) {
        val = K;
        ans += '-';
    }
    ans += temp[i];
    val--;
}

// Reverse the final let and
// return it.
ans = reverse(ans);
return ans;

}

let s = "5F3Z-2e-9-w"; let K = 4; console.log(ReFormatString(s, K));

`

**[Expected Approach] Using One variable - O(n) Time and O(1) Space

This is mainly an optimization over the above Greedy Approach.

Follow the steps to solve the problem:

#include <bits/stdc++.h> using namespace std;

string ReFormatString(string S, int K){ int len = S.length(); int cnt = 0; int x = 0;

// Move the characters to the
// back of the string.
for (int i = len - 1; i >= 0; i--) {
    if (S[i] == '-') {
        x++;
    }
    else {
        S[i + x] = toupper(S[i]);
    }
}

// Calculate total number of
// alphanumeric characters so
// as to get the number of dashes
// in the final string.
int slen = len - x;
int step = slen / K;

// Remove x characters from the
// start of the string

reverse(S.begin(), S.end());
int val = x;
while (val--) {
    S.pop_back();
}

// Push the empty spaces in
// the string (slen+step) to get
// the final string length

int temp = step;
while (temp--)
    S.push_back(' ');
reverse(S.begin(), S.end());

len = S.length();

// Using simple mathematics
// to push the elements
// in the string at the correct place.

int i = slen, j = step, f = 0;
while (j < len) {

    // At every step calculate the
    // number of dashes that would be
    // present before the character
    step = i / K;
    if (f == 1)
        step--;
    int rem = i % K;

    // If the remainder is zero it
    // implies that the character is a dash.

    if (rem == 0 and f == 0) {
        S[j - step] = '-';
        f = 1;
        continue;
    }
    S[j - step] = S[j];
    i--;
    j++;
    f = 0;
}
// Remove all the dashes that would have
// accumulated in the beginning of the string.

len = S.length();
reverse(S.begin(), S.end());
for (int i = len - 1; i >= 0; i--) {
    if (S[i] != '-') {
        break;
    }
    if (S[i] == '-')
        S.pop_back();
}
reverse(S.begin(), S.end());

return S;

} int main() { string s = "5F3Z-2e-9-w"; int K = 4; cout << ReFormatString(s, K); return 0; }

Java

/*package whatever //do not write package name here */

import java.io.; import java.util.;

class GFG {

public static String reverseS(String str){ String nstr = ""; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); nstr = ch + nstr; } return nstr; }

public static String ReFormatString(String S, int K) { int len = S.length(); int cnt = 0; int x = 0;

// Move the characters to the
// back of the string.
for (int i = len - 1; i >= 0; i--) {
  if (S.charAt(i) == '-') {
    x++;
  }
  else {
    S = S.substring(0, i + x)
      + Character.toUpperCase(S.charAt(i))
      + S.substring(i + x + 1);
  }
}

// Calculate total number of
// alphanumeric characters so
// as to get the number of dashes
// in the final string.
int slen = len - x;
int step = (int)(slen / K);

// Remove x characters from the
// start of the string

S = reverseS(S);
int val = x;
while (val > 0) {
  S = S.substring(0, S.length() - 1);
  val--;
}

// Push the empty spaces in
// the string (slen+step) to get
// the final string length

int temp = step;
while (temp > 0) {
  S += " ";
  temp--;
}
S = reverseS(S);

len = S.length();

// Using simple mathematics
// to push the elements
// in the string at the correct place.

int i = slen, j = step, f = 0;
while (j < len) {

  // At every step calculate the
  // number of dashes that would be
  // present before the character
  step = (int)(i / K);
  if (f == 1)
    step--;
  int rem = i % K;

  // If the remainder is zero it
  // implies that the character is a dash.

  if (rem == 0 && f == 0) {
    S = S.substring(0, j - step) + "-"
      + S.substring(j - step + 1);
    f = 1;
    continue;
  }
  S = S.substring(0, j - step) + S.charAt(j)
    + S.substring(j - step + 1);
  i--;
  j++;
  f = 0;
}
// Remove all the dashes that would have
// accumulated in the beginning of the string.

len = S.length();
S = reverseS(S);
for (int m = len - 1; m >= 0; m--) {
  if (S.charAt(m) != '-') {
    break;
  }
  if (S.charAt(m) == '-')
    S = S.substring(0, S.length() - 1);
}
S = reverseS(S);

return S;

}

public static void main(String[] args) { String s = "5F3Z-2e-9-w"; int K = 4; System.out.println(ReFormatString(s, K)); } }

Python

def reverse(string): string = string[::-1] return string

def ReFormatString( S, K): length = len(S) cnt = 0 x = 0

for i in range(length-1,-1,-1):
    if (S[i] == '-'):
        x+=1
    else:
        S = S[:i+x] + S[i].upper() + S[i+x+1:]

# Calculate total number of
# alphanumeric characters so
# as to get the number of dashes
# in the final string.
slen = length - x
step = slen / K

# Remove x characterclss from the
# start of the string

S = reverse(S)
val = x
while (val>0):
    S = S[:len(S)-1]
    val-=1

# Push the empty spaces in
# the string (slen+step) to get
# the final string length

temp = step
while (temp>0):
    S+=' '
    temp-=1
S = reverse(S)
 
length = len(S)

# Using simple mathematics
# to push the elements
# in the string at the correct place.

i = slen
j = step
f = 0
while (j < length):

    # At every step calculate the
    # number of dashes that would be
    # present before the character
    step = int(i / K)
    if (f == 1):
        step-=1
    rem = i % K

    # If the remainder is zero it
    # implies that the character is a dash.
    if (rem == 0 and f == 0):
        step = int(step)
        j = int(j)
        S = S[:int(j-step)] + '-' + S[int(j-step)+1:]
        f = 1
        continue
    S = S[:int(j-step)] + S[int(j)] + S[int(j-step)+1:]
    i -= 1
    j += 1
    f = 0
# Remove all the dashes that would have
# accumulated in the beginning of the string.
length = len(S)
S = reverse(S)
for char in reversed(S):
    if (char != '-'):
        break
    if (char == '-'):
        S = S[:len(S)-1]
S = reverse(S)

return S

s = "5F3Z-2e-9-w" K = 4 print(ReFormatString(s, K))

C#

using System; using System.Collections.Generic;

public class GFG {

public static String reverseS(String str) { String nstr = ""; for (int i = 0; i < str.Length; i++) { char ch = str[i]; nstr = ch + nstr; } return nstr; }

public static String ReFormatString(String S, int K) { int len = S.Length; int x = 0; int i;

// Move the characters to the
// back of the string.
for (i = len - 1; i >= 0; i--) {
  if (S[i] == '-') {
    x++;
  }
  else {
    S = S.Substring(0, i + x)
      + Char.ToUpper(S[i])
      + S.Substring(i + x + 1);
  }
}

// Calculate total number of
// alphanumeric characters so
// as to get the number of dashes
// in the final string.
int slen = len - x;
int step = (int)(slen / K);

// Remove x characters from the
// start of the string

S = reverseS(S);
int val = x;
while (val > 0) {
  S = S.Substring(0, S.Length - 1);
  val--;
}

// Push the empty spaces in
// the string (slen+step) to get
// the final string length

int temp = step;
while (temp > 0) {
  S += " ";
  temp--;
}
S = reverseS(S);

len = S.Length;

// Using simple mathematics
// to push the elements
// in the string at the correct place.

i = slen;
int j = step, f = 0;
while (j < len) {

  // At every step calculate the
  // number of dashes that would be
  // present before the character
  step = (int)(i / K);
  if (f == 1)
    step--;
  int rem = i % K;

  // If the remainder is zero it
  // implies that the character is a dash.

  if (rem == 0 && f == 0) {
    S = S.Substring(0, j - step) + "-"
      + S.Substring(j - step + 1);
    f = 1;
    continue;
  }
  S = S.Substring(0, j - step) + S[j]
    + S.Substring(j - step + 1);
  i--;
  j++;
  f = 0;
}
// Remove all the dashes that would have
// accumulated in the beginning of the string.

len = S.Length;
S = reverseS(S);
for (int m = len - 1; m >= 0; m--) {
  if (S[m] != '-') {
    break;
  }
  if (S[m] == '-')
    S = S.Substring(0, S.Length - 1);
}
S = reverseS(S);

return S;

}

static public void Main() {

string s = "5F3Z-2e-9-w";
int K = 4;
Console.WriteLine(ReFormatString(s, K));

} }

JavaScript

function ReFormatString(S, K) { let len = S.length; let cnt = 0; let x = 0;

// Move the characters to the
// back of the string.
for (let i = len - 1; i >= 0; i--) {
    if (S[i] == '-') {
        x++;
    }
    else {
        let c = (S[i].toUpperCase());
        let arr1 = S.split('');
        arr1[i + x] = c;
        S = arr1.join("");
    }
}

// Calculate total number of
// alphanumeric characters so
// as to get the number of dashes
// in the final string.
let slen = len - x;
let step = slen / K;

// Remove x characters from the
// start of the string

S = S.split('').reverse().join('');

let val = x;
while (val--) {
    S = S.substring(0, S.length - 1);
}

// Push the empty spaces in
// the string (slen+step) to get
// the final string length

let temp = step;
while (temp--)
    S += ' ';
S = S.split('').reverse().join('');

len = S.length;

// Using simple mathematics
// to push the elements
// in the string at the correct place.

let i = slen, j = step, f = 0;
while (j < len) {

    // At every step calculate the
    // number of dashes that would be
    // present before the character
    step = Math.floor(i / K);
    if (f == 1)
        step--;
    let rem = i % K;

    // If the remainder is zero it
    // implies that the character is a dash.

    if (rem == 0 && f == 0) {
        let arr2 = S.split('');
        arr2[j - step] = '-';
        S = arr2.join("");
        f = 1;
        continue;
    }
    let arr3 = S.split('');
    arr3[j - step] = S[j];
    S = arr3.join("");
    i--;
    j++;
    f = 0;
}
// Remove all the dashes that would have
// accumulated in the beginning of the string.

len = S.length;
S = S.split('').reverse().join('');

for (let i = len - 1; i >= 0; i--) {
    if (S[i] != '-') {
        break;
    }
    if (S[i] == '-')
        S = S.substring(0, S.length - 1);

}
S = S.split('').reverse().join('');
return S;

}

let s = "5F3Z-2e-9-w"; let K = 4; console.log(ReFormatString(s, K));

`