Python | Test if string is subset of another
Last Updated :
03 Apr, 2023
Sometimes, while working with strings, we can have a problem in which we need to test if a string is a subsequence of another. This can have possible application in many domains including data science and day-day programming. Lets discuss certain ways in which this task can be performed.
Method #1: Using all() This is one of the by which we can solve this problem. In this, we employ all() to check if all the characters of one string are present in another.
Python3
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
res = all (ele in test_str1 for ele in test_str2)
print ( "Does string contains all the characters of other list? : " + str (res))
|
Output :
The original string is : geeksforgeeks
Does string contains all the characters of other list? : True
Time complexity: O(m*n), where m is the length of the first string and n is the length of the second string.
Auxiliary space: O(1), because it only uses a few variables (test_str1, test_str2, res, and ele) that do not depend on the size of the input strings.
Method #2: Using issubset() Using an inbuilt function is one of the ways in which this task can be performed. In this, we just employ the function and it returns the result after internal processing.
Python3
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
res = set (test_str2).issubset(test_str1)
print ( "Does string contains all the characters of other list? : " + str (res))
|
Output :
The original string is : geeksforgeeks
Does string contains all the characters of other list? : True
Time Complexity: O(n)
Auxiliary Space: O(n)
Method#3: Using Recursive method.
- Initialize an empty set called set1
- Loop through each character in test_str1
- Add the character to set1
- Loop through each character in test_str2
- If the character is not in set1, return False
- If all characters in test_str2 are in set1, return True
Python3
def is_subset(test_str1, test_str2):
if not test_str2:
return True
if not test_str1:
return False
if test_str1[ 0 ] = = test_str2[ 0 ]:
return is_subset(test_str1[ 1 :], test_str2[ 1 :])
return is_subset(test_str1[ 1 :], test_str2)
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
res = is_subset(test_str1, test_str2)
print ( "Does string contains all the characters of other list? : " + str (res))
|
Output
The original string is : geeksforgeeks
Does string contains all the characters of other list? : True
Time Complexity: O(m*n), where m and n are the lengths of the input strings test_str1 and test_str2, respectively. This is because the function recursively checks each character of test_str2 against each character of test_str1, and in the worst case, all characters of both strings will be checked.
Auxiliary Space: O(m*n), as each recursive call creates a new slice of the input strings. Therefore, if the input strings are very long, the function will use a lot of memory due to the recursive calls.
Method#4: Using the ‘filter’ function and the ‘len’ function:
- Initialize the strings test_str1 and test_str2.
- Print the original value of test_str1.
- Use filter() and lambda to create a new list that only contains characters from test_str2 that are also in test_str1.
- Convert the filtered list to a normal list and check if its length is equal to the length of test_str2.
- Print the result.
Python3
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
result = len (test_str2) = = len ( list ( filter ( lambda c: c in test_str1, test_str2)))
print ( "Does string contains all the characters of other list? : " + str (result))
|
Output
The original string is : geeksforgeeks
Does string contains all the characters of other list? : True
Time complexity : O(n), where n is the length of the shorter string between test_str1 and test_str2. This is because the filter() function needs to iterate through test_str2 to check if each character is also in test_str1.
Auxiliary space : O(n), where n is the length of the shorter string between test_str1 and test_str2. This is because the filter() function creates a new list containing at most n characters, and the list() function also creates a new list containing those n characters. The len() function and boolean comparison also take constant space.
Method#5: Using Counter function
Step-by-step approach:
- Initialize two strings test_str1 and test_str2.
- Print the original string.
- Use all() method to test if string test_str2 is a subset of string test_str1.
- Store the result in the variable res.
- Print the final result.
Python3
from collections import Counter
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
count1 = Counter(test_str1)
count2 = Counter(test_str2)
res = not bool (count2 - count1)
print ( "Does string contains all the characters of other list? : " + str (res))
|
Output
The original string is : geeksforgeeks
Does string contains all the characters of other list? : True
Time Complexity: O(n*m), where n is the length of the string test_str1 and m is the length of the string test_str2. This is because we need to check if each character of test_str2 is present in test_str1.
Auxiliary Space: O(1), as we are not using any additional data structures and are only storing boolean values in a single variable res.
Method#6: Using reduce() function with lambda function:
Algorithm:
- Import the reduce function from functools module.
- Define the is_subset function that takes two string arguments, str1 and str2.
- In the is_subset function, use the reduce function to apply a logical AND operation to all the elements of the sequence.
- Use the map function to apply a lambda function that checks if each character in str2 is in str1.
- Return the result of reduce and map as the output of the function.
- Define the test_str1 and test_str2 strings.
- Call the is_subset function and pass test_str1 and test_str2 as arguments.
- Print the result.
Python3
from functools import reduce
def is_subset(str1, str2):
return reduce ( lambda a, b: a and b, map ( lambda c: c in str1, str2))
test_str1 = "geeksforgeeks"
test_str2 = "gfks"
print ( "The original string is : " + test_str1)
print (is_subset(test_str1, test_str2))
|
Output
The original string is : geeksforgeeks
True
Time complexity:
The time complexity of the is_subset function is O(n), where n is the length of str2. The map function takes O(n) time to create a new list of Boolean values, and the reduce function takes O(n) time to compute the final result.
Space complexity:
The space complexity of the is_subset function is also O(n), where n is the length of str2. The map function creates a new list of Boolean values, which requires O(n) space, and the reduce function requires O(1) space.
Please Login to comment...