Change gender of string i.e toggle all the gender-specific words in the input string.
Examples:
Input: “she is my sister” Output: “he is my brother”. There are two gender-specific words in this sentence:“she” and “sister”. After toggling gender specific words to their respective counterparts - “he” and “brother” : Gender specific words of the string are now changed.
Algorithm:
- Maintain a hash-map which maps all the “female” words to the “male” words and all the “male” words to “female” ones.
- Then for each word in the string, we check whether this is a gender-specific word or not. If it is then we swap this word with its counterpart word. Else we don’t swap this word.
- All the words gets concatenated in a new string, which at the end is printed and is our required string.
// A C++ Program to change the gender of a string
#include<bits/stdc++.h>
using namespace std;
// A Function that returns the new string with gender
// changed
string changeGender(string str)
{
// A Dictionary to store the mapping of genders
// The user can add his words too.
unordered_multimap <string, string> dictionary =
{
{"batman", "batwoman"}, {"batwoman", "batman"},
{"boy", "girl"}, {"girl", "boy"},
{"boyfriend", "girlfriend"}, {"girlfriend", "boyfriend"},
{"father", "mother"}, {"mother", "father"},
{"husband", "wife"}, {"wife", "husband"},
{"he", "she"}, {"she", "he"},
{"his", "her"}, {"her", "his"},
{"male", "female"}, {"female", "male"},
{"man", "woman"}, {"woman", "man"},
{"Mr", "Ms"}, {"Mr", "Ms"},
{"sir", "madam"}, {"madam", "sir"},
{"son", "daughter"}, {"daughter", "son"},
{"uncle", "aunt"}, {"aunt", "uncle"},
};
str = str + ' '; // Append a space at the end
int n = str.length();
// 'temp' string will hold the intermediate words
// and 'ans' string will be our result
string temp = "", ans = "";
for (int i=0; i<=n-1; i++)
{
if (str[i] != ' ')
temp.push_back(str[i]);
else
{
// If this is a 'male' or a 'female' word then
// swap this with its counterpart
if (dictionary.find(temp) != dictionary.end())
temp = dictionary.find(temp)->second;
ans = ans + temp + ' ';
temp.clear();
}
}
return(ans);
}
// Driver Program to test above functions
int main()
{
string str = "she is going to watch movie with"
" her boyfriend";
cout << changeGender(str);
return (0);
}
import java.util.HashMap;
import java.util.Map;
public class ChangeGender {
// A Function that returns the new string with gender changed
public static String changeGender(String str)
{
// A Map to store the mapping of genders
// The user can add his words too.
Map<String, String> dictionary = new HashMap<>();
dictionary.put("batman", "batwoman");
dictionary.put("batwoman", "batman");
dictionary.put("boy", "girl");
dictionary.put("girl", "boy");
dictionary.put("boyfriend", "girlfriend");
dictionary.put("girlfriend", "boyfriend");
dictionary.put("father", "mother");
dictionary.put("mother", "father");
dictionary.put("husband", "wife");
dictionary.put("wife", "husband");
dictionary.put("he", "she");
dictionary.put("she", "he");
dictionary.put("his", "her");
dictionary.put("her", "his");
dictionary.put("male", "female");
dictionary.put("female", "male");
dictionary.put("man", "woman");
dictionary.put("woman", "man");
dictionary.put("Mr", "Ms");
dictionary.put("Ms", "Mr");
dictionary.put("sir", "madam");
dictionary.put("madam", "sir");
dictionary.put("son", "daughter");
dictionary.put("daughter", "son");
dictionary.put("uncle", "aunt");
dictionary.put("aunt", "uncle");
str = str + " "; // Append a space at the end
int n = str.length();
// 'temp' string will hold the intermediate words
// and 'ans' string will be our result
String temp = "", ans = "";
for (int i = 0; i <= n - 1; i++) {
if (str.charAt(i) != ' ')
temp += str.charAt(i);
else {
// If this is a 'male' or a 'female' word then
// swap this with its counterpart
if (dictionary.containsKey(temp))
temp = dictionary.get(temp);
ans = ans + temp + " ";
temp = "";
}
}
return ans;
}
// Driver Program to test above functions
public static void main(String[] args) {
String str = "she is going to watch movie with her boyfriend";
System.out.println(changeGender(str));
}
}
# A Python program to change the gender of a string
# A Function that returns the new string with gender changed
def change_gender(string):
# A Dictionary to store the mapping of genders
# The user can add his words too.
dictionary = {
"batman": "batwoman", "batwoman": "batman",
"boy": "girl", "girl": "boy",
"boyfriend": "girlfriend", "girlfriend": "boyfriend",
"father": "mother", "mother": "father",
"husband": "wife", "wife": "husband",
"he": "she", "she": "he",
"his": "her", "her": "his",
"male": "female", "female": "male",
"man": "woman", "woman": "man",
"Mr": "Ms", "Ms": "Mr",
"sir": "madam", "madam": "sir",
"son": "daughter", "daughter": "son",
"uncle": "aunt", "aunt": "uncle",
}
string += ' ' # Append a space at the end
n = len(string)
# 'temp' string will hold the intermediate words
# and 'ans' string will be our result
temp = ""
ans = ""
for i in range(n):
if string[i] != ' ':
temp += string[i]
else:
# If this is a 'male' or a 'female' word then
# swap this with its counterpart
if temp in dictionary:
temp = dictionary[temp]
ans += temp + ' '
temp = ""
return ans
# Driver Program to test above functions
if __name__ == "__main__":
string = "she is going to watch movie with her boyfriend"
print(change_gender(string))
using System;
using System.Collections.Generic;
class Program
{
static string ChangeGender(string str)
{
// A Dictionary to store the mapping of genders
// The user can add his words too.
Dictionary<string, string> dictionary = new Dictionary<string, string>
{
{ "batman", "batwoman" }, { "batwoman", "batman" },
{ "boy", "girl" }, { "girl", "boy" },
{ "boyfriend", "girlfriend" }, { "girlfriend", "boyfriend" },
{ "father", "mother" }, { "mother", "father" },
{ "husband", "wife" }, { "wife", "husband" },
{ "he", "she" }, { "she", "he" },
{ "his", "her" }, { "her", "his" },
{ "male", "female" }, { "female", "male" },
{ "man", "woman" }, { "woman", "man" },
{ "Mr", "Ms" }, { "Ms", "Mr" },
{ "sir", "madam" }, { "madam", "sir" },
{ "son", "daughter" }, { "daughter", "son" },
{ "uncle", "aunt" }, { "aunt", "uncle" }
};
str += ' '; // Append a space at the end
int n = str.Length;
// 'temp' string will hold the intermediate words
// and 'ans' string will be our result
string temp = "", ans = "";
for (int i = 0; i <= n - 1; i++)
{
if (str[i] != ' ')
{
temp += str[i];
}
else
{
// If this is a 'male' or a 'female' word then
// swap this with its counterpart
if (dictionary.ContainsKey(temp))
{
temp = dictionary[temp];
}
ans += temp + ' ';
temp = "";
}
}
return ans;
}
static void Main(string[] args)
{
string str = "she is going to watch movie with her boyfriend";
Console.WriteLine(ChangeGender(str));
Console.ReadKey();
}
}
// A Function that returns the new string with gender
// changed
function changeGender(str) {
// A Dictionary to store the mapping of genders
// The user can add his words too.
const dictionary = new Map([
["batman", "batwoman"], ["batwoman", "batman"],
["boy", "girl"], ["girl", "boy"],
["boyfriend", "girlfriend"], ["girlfriend", "boyfriend"],
["father", "mother"], ["mother", "father"],
["husband", "wife"], ["wife", "husband"],
["he", "she"], ["she", "he"],
["his", "her"], ["her", "his"],
["male", "female"], ["female", "male"],
["man", "woman"], ["woman", "man"],
["Mr", "Ms"], ["Ms", "Mr"],
["sir", "madam"], ["madam", "sir"],
["son", "daughter"], ["daughter", "son"],
["uncle", "aunt"], ["aunt", "uncle"],
]);
str = str + ' '; // Append a space at the end
const n = str.length;
// 'temp' string will hold the intermediate words
// and 'ans' string will be our result
let temp = "", ans = "";
for (let i = 0; i <= n - 1; i++) {
if (str[i] != ' ')
temp += str[i];
else {
// If this is a 'male' or a 'female' word then
// swap this with its counterpart
if (dictionary.has(temp))
temp = dictionary.get(temp);
ans = ans + temp + ' ';
temp = "";
}
}
return (ans);
}
// Driver Program to test above function
const str = "she is going to watch movie with her boyfriend";
console.log(changeGender(str));
Output
he is going to watch movie with his girlfriend
Time Complexity: O(N^2), where N is the length of the string, as the ‘+’/ ‘append’ operator of the string can take upto O(N) time and assuming that lookup in the dictionary takes O(1) worse case time.
Auxiliary Space: Apart from the dictionary that maps all the words to its counterpart, we declare O(N) space for the new string, where N is the length of input string.
Scope for Improvement:
- We can add more words and their counterparts in the dictionary to increase the accuracy of the program. For example, we can add – “actor , actress” , “god , goddess” to our dictionary.
- A text file of words of all female and male words can also be imported.
- The program can be modified to become case insensitive.