Generate a string which differs by only a single character from all given strings
Last Updated :
09 Nov, 2023
Given an array of strings str[] of length N, consisting of strings of the same length, the task is to find the string which only differs by a single character from all the given strings. If no such string can be generated, print -1. In case of multiple possible answers, print any of them.
Example:
Input: str[] = { "abac", "zdac", "bdac"}
Output: adac
Explanation:
The string "adac" differs from all the given strings by a single character.
Input: str[] = { "geeks", "teeds"}
Output: teeks
Approach: Follow the steps below to solve the problem:
- Set the first string as the answer.
- Now, replace the first character of the string to all possible characters and check if it differs by a single character from the other strings or not.
- Repeat this process for all the characters in the first string.
- If any such string of the required type is found from the above step, print the string.
- If no such situation arises where replacing a single character of the first string generates a string of the required type, print -1.
Below is the implementation of the above approach.
C++
// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
#define ll long long
using namespace std;
// Function to check if a given string
// differs by a single character from
// all the strings in an array
bool check(string ans, vector<string>& s,
int n, int m)
{
// Traverse over the strings
for (int i = 1; i < n; ++i) {
// Stores the count of characters
// differing from the strings
int count = 0;
for (int j = 0; j < m; ++j) {
if (ans[j] != s[i][j])
count++;
}
// If differs by more than one
// character
if (count > 1)
return false;
}
return true;
}
// Function to find the string which only
// differ at one position from the all
// given strings of the array
string findString(vector<string>& s)
{
// Size of the array
int n = s.size();
// Length of a string
int m = s[0].size();
string ans = s[0];
int flag = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < 26; ++j) {
string x = ans;
// Replace i-th character by all
// possible characters
x[i] = (j + 'a');
// Check if it differs by a
// single character from all
// other strings
if (check(x, s, n, m)) {
ans = x;
flag = 1;
break;
}
}
// If desired string is obtained
if (flag == 1)
break;
}
// Print the answer
if (flag == 0)
return "-1";
else
return ans;
}
// Driver code
int main()
{
vector<string> s = { "geeks", "teeds" };
// Function call
cout << findString(s) << endl;
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
// Function to check if a given string
// differs by a single character from
// all the strings in an array
static boolean check(String ans, String[] s,
int n, int m)
{
// Traverse over the strings
for(int i = 1; i < n; ++i)
{
// Stores the count of characters
// differing from the strings
int count = 0;
for(int j = 0; j < m; ++j)
{
if (ans.charAt(j) != s[i].charAt(j))
count++;
}
// If differs by more than one
// character
if (count > 1)
return false;
}
return true;
}
// Function to find the string which only
// differ at one position from the all
// given strings of the array
static String findString(String[] s)
{
// Size of the array
int n = s.length;
String ans = s[0];
// Length of a string
int m = ans.length();
int flag = 0;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < 26; ++j)
{
String x = ans;
// Replace i-th character by all
// possible characters
x = x.replace(x.charAt(i), (char)(j + 'a'));
// Check if it differs by a
// single character from all
// other strings
if (check(x, s, n, m))
{
ans = x;
flag = 1;
break;
}
}
// If desired string is obtained
if (flag == 1)
break;
}
// Print the answer
if (flag == 0)
return "-1";
else
return ans;
}
// Driver code
public static void main(String []args)
{
String s[] = { "geeks", "teeds" };
// Function call
System.out.println(findString(s));
}
}
// This code is contributed by chitranayal
Python3
# Python3 program to implement
# the above approach
# Function to check if a given string
# differs by a single character from
# all the strings in an array
def check(ans, s, n, m):
# Traverse over the strings
for i in range(1, n):
# Stores the count of characters
# differing from the strings
count = 0
for j in range(m):
if(ans[j] != s[i][j]):
count += 1
# If differs by more than one
# character
if(count > 1):
return False
return True
# Function to find the string which only
# differ at one position from the all
# given strings of the array
def findString(s):
# Size of the array
n = len(s)
# Length of a string
m = len(s[0])
ans = s[0]
flag = 0
for i in range(m):
for j in range(26):
x = list(ans)
# Replace i-th character by all
# possible characters
x[i] = chr(j + ord('a'))
# Check if it differs by a
# single character from all
# other strings
if(check(x, s, n, m)):
ans = x
flag = 1
break
# If desired string is obtained
if(flag == 1):
break
# Print the answer
if(flag == 0):
return "-1"
else:
return ''.join(ans)
# Driver Code
# Given array of strings
s = [ "geeks", "teeds" ]
# Function call
print(findString(s))
# This code is contributed by Shivam Singh
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function to check if a given string
// differs by a single character from
// all the strings in an array
static bool check(String ans, String[] s,
int n, int m)
{
// Traverse over the strings
for(int i = 1; i < n; ++i)
{
// Stores the count of characters
// differing from the strings
int count = 0;
for(int j = 0; j < m; ++j)
{
if (ans[j] != s[i][j])
count++;
}
// If differs by more than one
// character
if (count > 1)
return false;
}
return true;
}
// Function to find the string which only
// differ at one position from the all
// given strings of the array
static String findString(String[] s)
{
// Size of the array
int n = s.Length;
String ans = s[0];
// Length of a string
int m = ans.Length;
int flag = 0;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < 26; ++j)
{
String x = ans;
// Replace i-th character by all
// possible characters
x = x.Replace(x[i], (char)(j + 'a'));
// Check if it differs by a
// single character from all
// other strings
if (check(x, s, n, m))
{
ans = x;
flag = 1;
break;
}
}
// If desired string is obtained
if (flag == 1)
break;
}
// Print the answer
if (flag == 0)
return "-1";
else
return ans;
}
// Driver code
public static void Main(String []args)
{
String []s = { "geeks", "teeds" };
// Function call
Console.WriteLine(findString(s));
}
}
// This code is contributed by Rajput-Ji
JavaScript
<script>
// JavaScript program to implement
// the above approach
// Function to check if a given string
// differs by a single character from
// all the strings in an array
function check(ans, s, n, m)
{
// Traverse over the strings
for (var i = 1; i < n; ++i)
{
// Stores the count of characters
// differing from the strings
var count = 0;
for (var j = 0; j < m; ++j) {
if (ans[j] !== s[i][j]) count++;
}
// If differs by more than one
// character
if (count > 1) return false;
}
return true;
}
// Function to find the string which only
// differ at one position from the all
// given strings of the array
function findString(s)
{
// Size of the array
var n = s.length;
var ans = s[0];
// Length of a string
var m = ans.length;
var flag = 0;
for (var i = 0; i < m; ++i) {
for (var j = 0; j < 26; ++j) {
var x = ans;
// Replace i-th character by all
// possible characters
x = x.replace(x[i], String.fromCharCode(j + "a".charCodeAt(0)));
// Check if it differs by a
// single character from all
// other strings
if (check(x, s, n, m)) {
ans = x;
flag = 1;
break;
}
}
// If desired string is obtained
if (flag === 1) break;
}
// Print the answer
if (flag === 0) return "-1";
else return ans;
}
// Driver code
var s = ["geeks", "teeds"];
// Function call
document.write(findString(s));
// This code is contributed by rdtank.
</script>
Time Complexity: O(N * M2 * 26)
Auxiliary Space: O(M)
Another approach: using a hash table
We can iterate over each string in the given array and for each character in the string, we can replace it with all the possible characters and store the resulting strings in the hash table along with their frequency. If a string occurs n-1 times in the hash table, where n is the number of strings in the array, then it is the required string. If no such string is found, then we can return -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#define ll long long
using namespace std;
// Function to find the string which only differ at one position from the all given strings of the array
string findString(vector<string>& s)
{
// Size of the array
int n = s.size();
// Length of a string
int m = s[0].size();
// Create an unordered map to store the frequency of each generated string
unordered_map<string, int> mp;
// Generate all possible strings that can be formed by changing exactly one character in each input string
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
string temp = s[i];
for (char ch = 'a'; ch <= 'z'; ++ch) {
temp[j] = ch;
mp[temp]++;
}
}
}
// Traverse over the map and find the string that differs from all input strings at exactly one position
for (auto it : mp) {
if (it.second == n && s[0] != it.first) {
int count = 0;
for (int i = 0; i < m; ++i) {
if (s[0][i] != it.first[i])
count++;
}
if (count == 1)
return it.first;
}
}
// If no such string is found, return "-1"
return "-1";
}
// Driver code
int main()
{
// Input vector of strings
vector<string> s = {"abac", "zdac", "bdac"};
// Function call
cout << findString(s) << endl;
return 0;
}
Java
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
public class Main {
// Function to find the string which only differs at one position from all given strings in the array
public static String findString(List<String> s) {
// Size of the array
int n = s.size();
// Length of a string
int m = s.get(0).length();
// Create a HashMap to store the frequency of each generated string
Map<String, Integer> mp = new HashMap<>();
// Generate all possible strings that can be formed by changing exactly one character in each input string
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
String temp = s.get(i);
for (char ch = 'a'; ch <= 'z'; ++ch) {
char[] tempArray = temp.toCharArray();
tempArray[j] = ch;
temp = new String(tempArray);
mp.put(temp, mp.getOrDefault(temp, 0) + 1);
}
}
}
// Traverse the map and find the string that differs from all input strings at exactly one position
for (Map.Entry<String, Integer> entry : mp.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
if (value == n && !s.get(0).equals(key)) {
int count = 0;
for (int i = 0; i < m; ++i) {
if (s.get(0).charAt(i) != key.charAt(i))
count++;
}
if (count == 1)
return key;
}
}
// If no such string is found, return "-1"
return "-1";
}
// Driver code
public static void main(String[] args) {
// Input list of strings
List<String> s = new ArrayList<>();
s.add("abac");
s.add("zdac");
s.add("bdac");
// Function call
System.out.println(findString(s));
}
}
// This code is contributed by rambabuguphka
Python3
# Function to find the string which only differs at one position from all given strings in the array
def find_string(strings):
# Number of strings in the input array
n = len(strings)
# Length of a string (assuming all strings have the same length)
m = len(strings[0])
# Create a dictionary to store the frequency of each generated string
mp = {}
# Generate all possible strings that can be formed by changing exactly one character in each input string
for i in range(n):
for j in range(m):
temp = list(strings[i])
for ch in range(ord('a'), ord('z')+1):
temp[j] = chr(ch)
modified_string = ''.join(temp)
if modified_string in mp:
mp[modified_string] += 1
else:
mp[modified_string] = 1
# Traverse the dictionary and find the string that differs from all input strings at exactly one position
for key, value in mp.items():
if value == n and strings[0] != key:
count = 0
for i in range(m):
if strings[0][i] != key[i]:
count += 1
if count == 1:
return key
# If no such string is found, return "-1"
return "-1"
# Driver code
if __name__ == "__main__":
# Input list of strings
strings = ["abac", "zdac", "bdac"]
# Function call
result = find_string(strings)
print(result)
C#
using System;
using System.Collections.Generic;
class Program {
// Function to find the string which differs at one
// position from all given strings
static string FindString(List<string> s)
{
// Size of the array
int n = s.Count;
// Length of a string
int m = s[0].Length;
// Create a dictionary to store the frequency of
// each generated string
Dictionary<string, int> frequencyMap
= new Dictionary<string, int>();
// Generate all possible strings that can be formed
// by changing exactly one character in each input
// string
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char[] temp = s[i].ToCharArray();
for (char ch = 'a'; ch <= 'z'; ch++) {
temp[j] = ch;
string modifiedString
= new string(temp);
if (frequencyMap.ContainsKey(
modifiedString)) {
frequencyMap[modifiedString]++;
}
else {
frequencyMap[modifiedString] = 1;
}
}
}
}
// Traverse the dictionary and find the string that
// differs from all input strings at exactly one
// position
foreach(var kvp in frequencyMap)
{
if (kvp.Value == n && !s[0].Equals(kvp.Key)) {
int count = 0;
for (int i = 0; i < m; i++) {
if (s[0][i] != kvp.Key[i]) {
count++;
}
}
if (count == 1) {
return kvp.Key;
}
}
}
// If no such string is found, return "-1"
return "-1";
}
// Driver code
static void Main()
{
// Input list of strings
List<string> s
= new List<string>{ "abac", "zdac", "bdac" };
// Function call
Console.WriteLine(FindString(s));
}
}
JavaScript
// Function to find the string which only differs at one position from all given strings in the array
function findString(strings) {
// Get the size of the array
const n = strings.length;
// Get the length of a string
const m = strings[0].length;
// Create an object to store the frequency of each generated string
const freqMap = {};
// Generate all possible strings that can be formed by changing exactly one character in each input string
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
const temp = strings[i].split('');
for (let ch = 'a'.charCodeAt(0); ch <= 'z'.charCodeAt(0); ch++) {
temp[j] = String.fromCharCode(ch);
const generatedString = temp.join('');
freqMap[generatedString] = (freqMap[generatedString] || 0) + 1;
}
}
}
// Traverse over the object and find the string that differs from all input strings at exactly one position
for (const generatedString in freqMap) {
if (freqMap[generatedString] === n && strings[0] !== generatedString) {
let count = 0;
for (let i = 0; i < m; i++) {
if (strings[0][i] !== generatedString[i]) {
count++;
}
}
if (count === 1) {
return generatedString;
}
}
}
// If no such string is found, return "-1"
return "-1";
}
// Driver code
const inputStrings = ["abac", "zdac", "bdac"];
// Function call
console.log(findString(inputStrings));
Time Complexity: O(N * M * 26)
Auxiliary Space: O(N * M * 26)
Similar Reads
Find smallest string with whose characters all given Strings can be generated
Given an array of strings arr[]. The task is to generate the string which contains all the characters of all the strings present in array and smallest in size. There can be many such possible strings and any one is acceptable. Examples: Input: arr[] = {"your", "you", "or", "yo"}Output: ruyoExplanati
5 min read
Count substrings of same length differing by a single character from two given strings
Given two strings S and T of length N and M respectively, the task is to count the number of ways of obtaining same-length substring from both the strings such that they have a single different character. Examples: Input: S = "ab", T = "bb"Output: 3Explanation: The following are the pairs of substri
7 min read
Generate a String from given Strings P and Q based on the given conditions
Given two strings P and Q, the task is to generate a string S satisfying the following conditions: Find S such that P is rearranged and Q is a substring in it.All the characters before Q in S should be smaller than or equal to the first character in Q and in lexicographic order.The rest of the chara
7 min read
Generate a string consisting of characters 'a' and 'b' that satisfy the given conditions
Given two integers A and B, the task is to generate and print a string str such that: str must only contain the characters 'a' and 'b'.str has length A + B and the occurrence of the character 'a' is equal to A and the occurrence of character 'b' is equal to BThe sub-strings "aaa" or "bbb" must not o
6 min read
All possible strings of any length that can be formed from a given string
Given a string of distinct characters, print all possible strings of any length that can be formed from given string characters. Examples: Input: abcOutput: a b c abc ab ac bc bac bca cb ca ba cab cba acbInput: abcdOutput: a b ab ba c ac ca bc cb abc acb bac bca cab cba d ad da bd db abd adb bad bda
10 min read
Maximize length of the String by concatenating characters from an Array of Strings
Find the largest possible string of distinct characters formed using a combination of given strings. Any given string has to be chosen completely or not to be chosen at all. Examples: Input: strings ="abcd", "efgh", "efgh" Output: 8Explanation: All possible combinations are {"", "abcd", "efgh", "abc
12 min read
Generate all passwords from given character set
Given a set of characters generate all possible passwords from them. This means we should generate all possible permutations of words using the given characters, with repetitions and also upto a given length. Examples: Input : arr[] = {a, b}, len = 2. Output : a b aa ab ba bb The solution is to use
8 min read
Generate all permutations of a string that follow given constraints
Given a string, generate all permutations of it that do not contain 'B' after 'A', i.e., the string should not contain "AB" as a substring. Examples: Input : str = "ABC" Output : ACB, BAC, BCA, CBA Out of 6 permutations of "ABC", 4 follow the given constraint and 2 ("ABC" and "CAB") do not follow. I
11 min read
Rearrange string such that characters at same distance from start and end are different
Given a string S of length N, rearrange the characters of the string such that for every index i < N / 2, S[i] != S[N-i-1]. Print -1 if it is impossible to form such a string. Note: If there are multiple possible answers, print any one of them. Examples: Input: S = "aabbcc"Output: "aacbcb"Explana
8 min read
Create a string with unique characters from the given N substrings
Given an array arr[] containing N substrings consisting of lowercase English letters, the task is to return the minimum length string that contains all given parts as a substring. All characters in this new answer string should be distinct. If there are multiple strings with the following property p
11 min read