Consider the Valid Anagram question where we return true if two strings are anagrams of each other:
e.g. validAnagram("name", "mane") returns true.
Assuming that we can only pass in the strings by value, a possible solution is to store the two sorted arrays into new variables, and then return whether those variables are equal:
func validAnagram(_ s: String, _ t: String) -> Bool {
guard s.count == t.count else { return false }
let sortedS = s.sorted()
let sortedT = t.sorted()
return sortedS == sortedT
}
In this case, the algorithm has a time complexity of O(nlogn), and space complexity O(2n) => O(n)
My question is whether changing the function to the following makes the space complexity O(1):
func validAnagram(_ s: String, _ t: String) -> Bool {
guard s.count == t.count else { return false }
return s.sorted() == t.sorted()
}
Is this true? Or is memory still allocated in the background to remember what s.sorted() and t.sorted() are, even though I am not explicitly initializing variables?
CodePudding user response:
It doesn't make any difference. You still allocate memory for sorted arrays.
To avoid using additional space you need to sort data in-place if it's possible.
