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.
CPP
// 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);
} |
Java
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));
}
} |
Python
# 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))
|
C#
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();
}
} |
Javascript
// 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.
Recommended Articles