C++ Program to Swap characters in a String
Last Updated :
18 Aug, 2023
Given a String S of length N, two integers B and C, the task is to traverse characters starting from the beginning, swapping a character with the character after C places from it, i.e. swap characters at position i and (i + C)%N. Repeat this process B times, advancing one position at a time. Your task is to find the final String after B swaps.
Examples:
Input : S = "ABCDEFGH", B = 4, C = 3;
Output: DEFGBCAH
Explanation:
after 1st swap: DBCAEFGH
after 2nd swap: DECABFGH
after 3rd swap: DEFABCGH
after 4th swap: DEFGBCAH
Input : S = "ABCDE", B = 10, C = 6;
Output : ADEBC
Explanation:
after 1st swap: BACDE
after 2nd swap: BCADE
after 3rd swap: BCDAE
after 4th swap: BCDEA
after 5th swap: ACDEB
after 6th swap: CADEB
after 7th swap: CDAEB
after 8th swap: CDEAB
after 9th swap: CDEBA
after 10th swap: ADEBC
Naive Approach:
- For large values of B, the naive approach of looping B times, each time swapping ith character with (i + C)%N-th character will result in high CPU time.
- The trick to solving this problem is to observe the resultant string after every N iterations, where N is the length of the string S.
- Again, if C is greater than or equal to the N, it is effectively equal to the remainder of C divided by N.
- Hereon, let's consider C to be less than N.
Below is the implementation of the approach:
C++
// C++ Program to Swap characters in a String
#include <iostream>
#include <string>
using namespace std;
string swapCharacters(string s, int B, int C)
{
int N = s.size();
// If c is greater than n
C = C % N;
// loop to swap ith element with (i + C) % n th element
for (int i = 0; i < B; i++) {
swap(s[i % N], s[(i + C) % N]);
}
return s;
}
int main()
{
string s = "ABCDEFGH";
int B = 4;
int C = 3;
s = swapCharacters(s, B, C);
cout << s << endl;
return 0;
}
// This code is contributed by Susobhan Akhuli
Time Complexity: O(B), to iterate B times.
Space Complexity: O(1)
Efficient Approach:
- If we observe the string that is formed after every N successive iterations and swaps (let's call it one full iteration), we can start to get a pattern.
- We can find that the string is divided into two parts: the first part of length C comprising of the first C characters of S, and the second part comprising of the rest of the characters.
- The two parts are rotated by some places. The first part is rotated right by (N % C) places every full iteration.
- The second part is rotated left by C places every full iteration.
- We can calculate the number of full iterations f by dividing B by N.
- So, the first part will be rotated left by ( N % C ) * f . This value can go beyond C and so, it is effectively ( ( N % C ) * f ) % C, i.e. the first part will be rotated by ( ( N % C ) * f ) % C places left.
- The second part will be rotated left by C * f places. Since, this value can go beyond the length of the second part which is ( N - C ), it is effectively ( ( C * f ) % ( N - C ) ), i.e. the second part will be rotated by ( ( C * f ) % ( N - C ) ) places left.
- After f full iterations, there may still be some iterations remaining to complete B iterations. This value is B % N which is less than N. We can follow the naive approach on these remaining iterations after f full iterations to get the resultant string.
Example:
s = ABCDEFGHIJK; c = 4;
parts: ABCD EFGHIJK
after 1 full iteration: DABC IJKEFGH
after 2 full iteration: CDAB FGHIJKE
after 3 full iteration: BCDA JKEFGHI
after 4 full iteration: ABCD GHIJKEF
after 5 full iteration: DABC KEFGHIJ
after 6 full iteration: CDAB HIJKEFG
after 7 full iteration: BCDA EFGHIJK
after 8 full iteration: ABCD IJKEFGH
Below is the implementation of the approach:
C++
// C++ program to find new after swapping
// characters at position i and i + c
// b times, each time advancing one
// position ahead
#include <bits/stdc++.h>
using namespace std;
string rotateLeft(string s, int p)
{
// Rotating a string p times left is
// effectively cutting the first p
// characters and placing them at the end
return s.substr(p) + s.substr(0, p);
}
// Method to find the required string
string swapChars(string s, int c, int b)
{
// Get string length
int n = s.size();
// If c is larger or equal to the length of
// the string is effectively the remainder of
// c divided by the length of the string
c = c % n;
if (c == 0)
{
// No change will happen
return s;
}
int f = b / n;
int r = b % n;
// Rotate first c characters by (n % c)
// places f times
string p1 = rotateLeft(s.substr(0, c),
((n % c) * f) % c);
// Rotate remaining character by
// (n * f) places
string p2 = rotateLeft(s.substr(c),
((c * f) % (n - c)));
// Concatenate the two parts and convert the
// resultant string formed after f full
// iterations to a string array
// (for final swaps)
string a = p1 + p2;
// Remaining swaps
for(int i = 0; i < r; i++)
{
// Swap ith character with
// (i + c)th character
char temp = a[i];
a[i] = a[(i + c) % n];
a[(i + c) % n] = temp;
}
// Return final string
return a;
}
// Driver code
int main()
{
// Given values
string s1 = "ABCDEFGHIJK";
int b = 1000;
int c = 3;
// Get final string print final string
cout << swapChars(s1, c, b) << endl;
}
// This code is contributed by rag2127
Time Complexity: O(n)
Space Complexity: O(n)
Please refer complete article on Swap characters in a String for more details!
Similar Reads
C++ Program to Replace a Character in a String Given a string S, c1 and c2. Replace character c1 with c2 and c2 with c1. Examples: Input: grrksfoegrrks, c1 = e, c2 = r Output: geeksforgeeks Input: ratul, c1 = t, c2 = h Output: rahul Traverse through the string and check for the occurrences of c1 and c2. If c1 is found then replace it with c2 and
3 min read
C++ Program to Sort String of Characters Sorting a string means rearranging the characters of the given string in some defined order such as alphabetical order. In this article, we will learn how to sort a string by characters in C++.ExamplesInput: str = "geeksforgeeks"Output: "eeeefggkkorss"Explanation: The characters in the string are so
4 min read
Convert character array to string in C++ This article shows how to convert a character array to a string in C++. The std::string in c++ has a lot of inbuilt functions which makes implementation much easier than handling a character array. Hence, it would often be easier to work if we convert a character array to string. Examples: Input: ch
4 min read
Convert String to Char Array in C++ In C++, we usually represent text data using the std::string object. But in some cases, we may need to convert a std::string to a character array, the traditional C-style strings. In this article, we will learn how to convert the string to char array in C++.ExamplesInput: str = "geeksforgeeks"Output
4 min read
How to Convert a Single Character to String in C++? A string is a generally made up of a sequence of multiple characters. In this article, we will learn how to convert a single character to a string in C++.Example:Input: c = 'A'Output: s = "a"Explanation: Character c is converted to a string.Input: c = '#'Output: s = "#"Explanation: Character c is co
4 min read
How to Remove Last Character From C++ String? In C++, strings are stored as the std::string class objects. In this article, we will look at how to remove the last character from this C++ string object. For Example, Input: Hello! GeeksOutput: Hello! GeekRemove the Last Character from a String in C++To remove the last character from a string, we
2 min read
How to Reverse a String in C++? Reversing a string means replacing the first character with the last character, second character with the second last character and so on. In this article, we will learn how to reverse a string in C++.ExamplesInput: str = "Hello World"Output: dlroW olleHExplanation: The last character is replaced by
2 min read
C++ Program To Reverse Words In A Given String Example: Let the input string be "i like this program very much". The function should change the string to "much very program this like i" Examples: Input: s = "geeks quiz practice code" Output: s = "code practice quiz geeks" Input: s = "getting good at coding needs a lot of practice" Output: s = "p
7 min read
String C/C++ Programs C program to swap two StringsC Program to Sort an array of names or stringsC Program to Check if a Given String is PalindromeC/C++ Program for Return maximum occurring character in the input stringC/C++ Program for Remove all duplicates from the input string.C/C++ Program for Print all the duplicate
3 min read
Program to reverse words in a given string in C++ Given a sentence in the form of string str, the task is to reverse each word of the given sentence in C++. Examples: Input: str = "the sky is blue" Output: blue is sky theInput: str = "I love programming" Output: programming love I Method 1: Using STL functions Reverse the given string str using STL
6 min read