String comparison (equals, compareTo) in Kotlin - Time & Space Complexity
When we compare two strings in Kotlin, the time it takes depends on their length.
We want to know how the work grows as the strings get longer.
Analyze the time complexity of the following code snippet.
val str1 = "hello"
val str2 = "world"
// Check if strings are equal
val areEqual = str1.equals(str2)
// Compare strings lexicographically
val comparison = str1.compareTo(str2)
This code checks if two strings are the same and then compares their order.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing characters one by one in the strings.
- How many times: Up to the length of the shorter string, until a difference is found or end is reached.
As strings get longer, the number of character checks grows roughly with the length of the shorter string.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 10 character comparisons |
| 100 | Up to 100 character comparisons |
| 1000 | Up to 1000 character comparisons |
Pattern observation: The work grows linearly with the string length.
Time Complexity: O(n)
This means the time to compare strings grows in a straight line as the strings get longer.
[X] Wrong: "String comparison always takes the same time no matter the string length."
[OK] Correct: The program checks characters one by one, so longer strings usually take more time.
Understanding how string comparison time grows helps you write efficient code and answer questions clearly.
"What if we compare strings that are always different in the first character? How would the time complexity change?"
Practice
val a = "Hello"
val b = "hello"Solution
Step 1: Understand equals() method
The equals() method checks if two strings are exactly the same including case.Step 2: Compare equals() with other options
compareTo() returns an order number, === checks reference equality (not content), equals(ignoreCase=true) ignores case, so only equals() matches exact case-sensitive check.Final Answer:
a.equals(b) -> Option AQuick Check:
Use equals() for exact string match [OK]
- Using compareTo() to check equality
- Assuming === checks content equality
- Using equals(ignoreCase=true) when case matters
str1 and str2 for equality ignoring case in Kotlin?Solution
Step 1: Recall equals() with ignoreCase parameter
In Kotlin, equals() can take ignoreCase=true to compare strings ignoring case differences.Step 2: Check other options
A: equals() without ignoreCase is case-sensitive, B: compareTo(ignoreCase=true) returns Int not Boolean, D: == is case-sensitive.Final Answer:
str1.equals(str2, ignoreCase = true) -> Option AQuick Check:
Use equals(ignoreCase=true) to ignore case [OK]
- Using compareTo(ignoreCase=true) directly (returns Int, not Boolean)
- Using == which is case-sensitive
- Forgetting to set ignoreCase=true
val s1 = "apple"
val s2 = "banana"
println(s1.compareTo(s2))
Solution
Step 1: Understand compareTo() behavior
compareTo() returns a negative number if the first string is lexicographically less than the second.Step 2: Compare "apple" and "banana" lex order
"apple" comes before "banana" alphabetically, so compareTo returns a negative number.Final Answer:
A negative number -> Option BQuick Check:
"apple" < "banana" means compareTo() < 0 [OK]
- Assuming compareTo() returns boolean
- Confusing positive and negative return values
- Thinking compareTo() returns 0 for different strings
val a = "Test"
val b = "test"
if (a.compareTo(b, ignoreCase = true)) {
println("Equal")
} else {
println("Not Equal")
}
Solution
Step 1: Check compareTo() return type
compareTo() returns an Int, not a Boolean, so it cannot be used directly in if condition.Step 2: Understand how to check equality with compareTo()
To check equality ignoring case, compareTo() == 0 should be used, not just compareTo() alone.Final Answer:
compareTo() returns Int, cannot be used as Boolean -> Option DQuick Check:
compareTo() returns Int, use == 0 to check equality [OK]
- Using compareTo() directly as Boolean
- Forgetting to compare result with 0
- Assuming ignoreCase is invalid parameter (it is valid)
val fruits = listOf("Banana", "apple", "Cherry") ignoring case?Solution
Step 1: Understand sorting ignoring case
To sort strings ignoring case, use a comparator that compares strings case-insensitively.Step 2: Check options for case-insensitive sorting
A and D are case-sensitive. C: sortedBy expects key selector, not Comparator (compile error). B uses built-in case-insensitive Comparator correctly.Final Answer:
fruits.sortedWith(String.CASE_INSENSITIVE_ORDER) -> Option CQuick Check:
Use sortedWith(String.CASE_INSENSITIVE_ORDER) for case-insensitive sort [OK]
- Using sorted() which is case-sensitive
- Using sortedBy { it } which is case-sensitive
- Confusing sortedBy (selector) with sortedWith (Comparator)
Ready to prove it?
Pass the test and this pattern moves unknown
